将UIButton添加到数组中

问题描述:

我对Swift中的编码比较新,我正在更新当前在应用商店中的应用程序。我目前正在创建一个数组,用于在xib文件中创建的tableView的单元格中的内容。这里是什么样子:将UIButton添加到数组中

`struct callData { 
    let cell : Int? 
    let hotlineName : String? 
    let phoneNumber : String? 
    let callBtn : UIButton? 
    let iconImg : UIImage? 

    init(cell:Int,hotlineName:String,phoneNumber:String, callBtn:UIButton, iconImg:UIImage) { 
     self.cell = cell 
     self.hotlineName = hotlineName 
     self.phoneNumber = phoneNumber 
     self.callBtn = callBtn 
     self.iconImg = iconImg 

    } 
} 

class _ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    var arrayOfCallData = [callData(
      cell: 0, 
      hotlineName:"", 
      phoneNumber:"", 
      callBtn:"", 
      iconImg: #imageLiteral(resourceName: "smartphone") 
     )] 

`

我不知道如何插入按钮(callBtn)到一个数组(arrayOfCallData)没有它提供大量的错误。它的目的是从应用程序的字符串中调用数字,但我不知道如何实现按钮调用的操作。 这里是用于从应用程序内调用代码的示例:

let url = NSURL(string: "tel://8004424673")! UIApplication.shared.open(url as URL)

我希望能够合并到该阵列(callBtn),这样我可以创建多个按钮,可以调用不同的号码。

+0

我编辑了你的代码格式,尽我所能。为代码缩进四个空格是正确的降价。然后我尽可能用arrayOfCallData'缩进 - 如果错误请更正。我发现它非常困难(甚至可能语法错误),以便理解“callBtn”键 - 这可能是您的问题。也许你可以通过将'let url'分成两行(也许是三行)代码来找到各种错误,*构建*该键的值。 – dfd

+0

谢谢!我不小心删除了callBtn和iconImg之间的逗号。 –

+0

你的代码没有意义。在初始化器中的'callBtn:'之后你不能说'let'什么。初始值设定项想要_objects_,而不是代码。以'let'开头的短语不是一个按钮。 – matt

在您的callData中,将您的电话号码保存为callBtnAction,然后您可以在选择器方法中将其取回。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let cellIdendifier: String = "CallDataCell" 

    let cellData = arrayOfCallData[indexPath.row] 

    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdendifier, for: indexPath) 
    let button = UIButton.init() 
    button.frame = CGRect.zero //Set your frame here 
    button.setTitle(cellData.callBtnText, for: UIControlState.normal) 
    button.tag = indexPath.row 
    button.addTarget(self, action: Selector(("buttonClicked:")), for: UIControlEvents.touchUpInside) 

    cell.addSubview(button) 
    return cell 

} 

func buttonClicked(sender:UIButton) { 
    let selectedRow = sender.tag 
    let callData = arrayOfCallData[selectedRow] 
    let action = callData.callBtnAction 
    print(action) 

} 

单元格应拥有视图(例如按钮),并且应该使用您的数据来装饰这些视图。因此,如果您从数据中移除UI关注点,例如用按钮标题字符串替换UIButton引用,可以将该数据应用于方法cellForRowAt中的单元格视图。

+0

如果我正确理解你,我应该将'let callBtn:UIButton?'更改为一个字符串并将let语句移动到'cellForRowAt'?我很抱歉,我没有完全理解这一点。 –

+0

是的,尝试用'let callBtnTitle:String'替换'let callBtn:UIButton'。注意你的UIViewController实现了UITableViewDataSource,这意味着你的视图控制器将实现一个'cellForRowAt'方法,你可以通过向你的数据应用来填充每个单元格。您的单元应该已经在xib中定义了一个按钮。一般的想法是,xib文件包含所有的UIViews,你的表格和单元格都将为你创建。然后,您将数据应用到每个单元格,例如cell.button.setTitle(“StringFromYourData”,用于:.normal)。祝你好运! – Norman