кнопка переключения с логическим значением в UITableView Swift - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы добавить булевский переключатель, чтобы узнать, была ли нажата кнопка (сохранит ли это значение в базовых данных (также хотел бы сохранить данные ячейки в базовых данных, если true, и удалить из базовых данных, если false)) IЯ не уверен, как это сделать.любая помощь будет принята с благодарностью.если весь код из контроллера представления необходим, оставьте комментарий, и я сделаю это (я уже настроил xcdatamodel).

  @IBAction func buttonTapped(_ sender:UIButton) {
    var superView = sender.superview
    while !(superView is UITableViewCell) {
        superView = superView?.superview
    }
    let cell = superView as! UITableViewCell
    if let indexpath = tableView.indexPath(for: cell){

        print(indexpath)
    }
}

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Добавить метод делегата в вашу ячейку - (void)myCell:(MyCell *)cell didTapButton:(UIButton *)button

Итак, в вашем VC вы можете работать в обратном направлении от объекта ячейки.

- (void)myCell:(MyCell *)cell didTapButton:(UIButton *)button
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    MyObject *object = [self.dataSource objectAtIndexPath:indexPath];

    // Do something with the knowledge that the button in the cell for the object was tapped... 

    // For example
    object.tapped = YES;
    [object.managedObjectContext save:NULL];
}

Просто нужно преобразовать в swift;)

0 голосов
/ 08 октября 2018

Что ж, я строю простой проект и выяснил что-то, используя протоколы. Сначала вы определяете протокол следующим образом:

protocol cellDidRequestSaving {
     func saveOrDelete(indexpath : Int)
}

Сначала в своей ячейке вы определяете свою кнопку следующим образом:

class TableViewCell: UITableViewCell {
    var delegate: cellDidRequestSaving?
    var indexPath = 0 //come from the parent
    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 didTap(_ sender: Any) {
        // this protocol defined in the parent
        delegate?.saveOrDelete(indexpath: indexPath)

    }
}

теперь в вас tableViewController вы используете протокол следующим образом:

 class TableViewController: UITableViewController, cellDidRequestSaving {
     var cellStat = [Int:Bool]()
     override func viewDidLoad() {
         super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem
    }

    // MARK: - Table view data source

     override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
         return 1
    }

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
         return 3
    }

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
         cell.indexPath = indexPath.row
         cell.delegate = self
        // Configure the cell...

         return cell
    }
     func saveOrDelete(indexpath: Int) {
         if let status = cellStat[indexpath], status {
            print(indexpath, "delete")
             cellStat[indexpath] = !status
        }
         else {
            print(indexpath, "save")
             cellStat[indexpath] = true
        }
    }

Это простой проект, но вы можете понять, как это сделать.Также обратите внимание на определение и использование протокола, чтобы вы ничего не пропустили.и результат - это Out Put of The Project

0 голосов
/ 07 октября 2018

Добавьте свойство в свою пользовательскую ячейку, например:

var indexPath: IndexPath = IndexPath(row: -1, section: -1)  //The -1 just know when it is not set yet

И в cellForRow в вашем tableView:

cell.indexpath = indexPath

Предположим, что buttonTapped определено в вашемПользовательский класс ячейки:

@IBAction func buttonTapped(_ sender:UIButton) {
    print(indexpath)
}
...