使用swift代码在按钮单击中在自定义UITableViewCell中添加UIAlertController?

时间:2016-07-25 08:52:13

标签: swift uitableview protocols uialertview custom-cell

我有menuTablecontroller,我在其中使用带有两个标签和另一个内部tableviewcontroller的customcell。现在在Innertableview中,我有一个带有两个标签和一个按钮的ItemCustomcell。我必须在单击此按钮时添加Alertviewcontroller。  我试过通过在menuTabletablecontroller中创建协议来设置委托,但它不起作用..

我的menutableviewcontroller

protocol customPostcodeAlertDelegate {
func showAlert(title:String,message:String)

}
class MenuTableViewController: UITableViewController {

 func showAlert(title:String,message:String){
    let alert = UIAlertController(title: "Choose Mode of Order", message:"", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.Default, handler: nil))

    self.presentViewController(alert, animated: true, completion: nil)

}
 .....

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

   let cell = tableView.dequeueReusableCellWithIdentifier("subcatcell", forIndexPath: indexPath)as! SubcatTableViewCell

   return cell
  }

现在在SubcatTableViewCell中,我的自定义单元格上有一个名为itemtableviewcell的按钮

我的SubcatTableViewCell

class SubcatTableViewCell: UITableViewCell,UITableViewDelegate,UITableViewDataSource {
  override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    InnerTableView.delegate = self
    InnerTableView.dataSource = self

    InnerTableView.bounces = false

}
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("itemCell")as! ItemTableViewCell
   return cell 
 }

现在我在itemtableviewcell中像这样设置委托

class ItemTableViewCell: UITableViewCell {

var delegate: customPostcodeAlertDelegate?

@IBOutlet var itemName: UILabel!
@IBOutlet var itemPrice: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

@IBAction func OrderBtnPressed(sender: AnyObject) {
    self.delegate?.showAlert("Choose Mode of Order", message: "")


}


 }

但点击orderpressed按钮后,alertview控制器无法工作.. 我在哪里做错了或者给我另一个想法,在自定义tableview中添加alertviewcontroller ???

2 个答案:

答案 0 :(得分:2)

您忘了实际设置代理:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("itemCell") as! ItemTableViewCell
    cell.delegate = // Your MenuTableViewController
    return cell 
 }

通知编辑

class MenuTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showAlert(_:)), name: "showError", object: nil)
    }


    func showAlert(sender: NSNotification) {
        let title = sender.object!["title"]
        let message = sender.object!["message"]

        let alert = UIAlertController(title: "Choose Mode of Order", message:"", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.Default, handler: nil))

        self.presentViewController(alert, animated: true, completion: nil)
    }

    ....
}

class ItemTableViewCell: UITableViewCell {

    @IBAction func OrderBtnPressed(sender: AnyObject) {
        NSNotificationCenter.defaultCenter().postNotificationName("showError", object: [ "message" : "A message", "title" : "A Title" ])
    }
}

答案 1 :(得分:0)

您没有将 MenuTableViewController 符合您的协议。你必须像MenuTableViewController: UITableViewController, customPostcodeAlertDelegate

那样遵守它

然后您可以覆盖其方法showAlert