如何使用同一类的另一个对象设置自定义类 UIButton?

Posted

技术标签:

【中文标题】如何使用同一类的另一个对象设置自定义类 UIButton?【英文标题】:How to set a custom class UIButton with another object of the same class? 【发布时间】:2017-06-03 15:45:25 【问题描述】:

我有一个带有海关单元格的 UITableView:ParagraphTableViewCell。

@IBDesignable
class ParagraphTableViewCell: UITableViewCell 

    weak var delegate: Paragraphprotocol?

    var paragraph:Paragraph!

    @IBInspectable @IBOutlet weak var dialogueLabel: UILabel!

    @IBInspectable @IBOutlet weak var choice1Button: ChoiceButton!
    @IBInspectable @IBOutlet weak var choice2Button: ChoiceButton!
    @IBInspectable @IBOutlet weak var choice3Button: ChoiceButton!

ChoiceButton 是一个 UIButton 自定义类:

class ChoiceButton: UIButton 

    var goToParagraphId: String!

    @IBInspectable var text: String? 
        didSet 
            self.setTitle(text, for: .normal)
            print("ChoiceButton didSet viewLabel, viewLabel = \(text!)")
        
    

    required init(text: String, goToParagraphId:String) 

        self.text = text
        self.goToParagraphId = goToParagraphId

        super.init(frame: .zero)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

对于我的项目,我创建了一个对象 Paragraph,其中定义了单元格内容。

class Paragraph: NSObject 

    var id:String! 
    var dialogueLabel: UILabel!  
    var choice1Button: ChoiceButton!
    var choice2Button: ChoiceButton!
    var choice3Button: ChoiceButton!

    init(dict: NSDictionary) 

        self.dialogueLabel = UILabel()
        self.dialogueLabel.text = dict["keyLabel"]! as! String


        if dict["button1"] != nil 
            self.choice1Button=ChoiceButton(text: dict["keyLabel"]! as! String, goToParagraphId: 1)
        

        //do the same for the other ChoiceButton


为了填充我的 UITableView,我有一个段落对象的 NSMutableArray。 在configureCell函数中,我需要用Paragraph对象的ChoiceButton来设置单元格的ChoiceButton。

  func configureCell(tableView: UITableView, cell: ParagraphTableViewCell, atIndexPath indexPath: IndexPath) 

        let paragraph = paragraphArray[indexPath.row] as! Paragraph
        cell.paragraph = paragraph

        //TO SET the ChoiceButton I tried :
        cell.choice1Button = paragraph.choice1Button // -> not worked

        //TO SET the ChoiceButton I tried also
        cell.choice1Button.goToParagraphId = paragraph.choice1Button.goToParagraphId
        cell.choice1Button.text = paragraph.choice1Button.text!
        // -> but the other properties of UIButton class are not set, as the state of the UIButton

        

我也尝试在 ChoiceButton 类中使用 NSCopying:

  func copy(with zone: NSZone? = nil) -> Any 

        let copy = ChoiceButton(text: text!, goToParagraphId: goToParagraphId)
        return copy

我不知道如何在不丢失 UIButton 属性的情况下将单元格中的 ChoiceButton 与段落对象中的 ChoiceButton 链接起来。

【问题讨论】:

听起来像是一种不寻常的方法...通常,在典型的表格视图格式中,您的 Paragraph 对象将仅包含数据,而不包含 UI 对象。您是否有理由不想简单地用UILabel 和三个ChoiceButtons 设计您的单元格,然后使用段落中的 data 分配.text 和 .setTitle()对象? 没有理由,我认为这是个好主意。 好的 - 那么我强烈建议不要使用该模型,因为您已经看到了可能遇到的许多问题中的第一个。 好的,谢谢你,我会听从你的建议的:) 【参考方案1】:

我用数组字典更新了我的段落对象,我在里面存储了数据来设置我的按钮:

class Paragraph: NSObject 

   var id:String!
   var dialogueLabel: UILabel!
   var choiceButtonArray:[Dictionary<String, String>] = []

   init(dict: NSDictionary) 

       for i in 0...2 
            self.choiceButtonArray.insert(["text":dict[String(i)]["keyLabel"], "goToParagraphId":dict[String(i)]["nextParagraphId"], at: i)
        
     

我用一个新的函数更新了我的 UIButton 子类:

 func setInfos(text: String, goToParagraphId:String, tag:Int) 

    self.text = text
    self.goToParagraphId = goToParagraphId 

在我的单元格中,我使用我的字典数组来设置按钮的信息:

choiceButton.setInfos(text: self.paragraph.choiceButtonArray[button]["text"]!, goToParagraphId: self.paragraph.choiceButtonArray[button]["goToParagraphId"]!)

【讨论】:

以上是关于如何使用同一类的另一个对象设置自定义类 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

访问同一类的另一个对象的受保护属性的方法

在同一个类的另一个成员函数的定义中调用一个类成员函数

如何从其构造函数设置自定义异常类的 InnerException

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

如何将一个自定义列表的选定数据显示到同一活动的另一个自定义列表视图

在同一类的另一个方法中调用方法时,拦截器不起作用