2015-12-28 6 views
1

Я знаю, я знаю, что это было задано лот раз. Я также нашел this question, но решение, которое оно предложило, не сработало для меня.Как добавить segue программно?

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

Я создал контроллер View с табличным представлением в нем. Я написал класс под названием PrototypeTableController, чтобы действовать как класс контроллера вида для контроллера вида, созданного в раскадровке.

Когда пользователь нажимает на одну из ячеек, я хочу показать другой контроллер вида, который называется Prototype Table Content. И другой текст будет показан, если вы нажмете на разные ячейки.

В раскадровке, это так:

enter image description here

Текст этикетки в Prototype Table Content будет отличаться, когда пользователь нажимает на другую ячейку. Это означает, что мне нужно отправить данные с одного контроллера представления на другой.

Сообщение упоминалось выше предположение, что я должен дать SEGUE идентификатор, так что я сделал:

enter image description here

Вот мой код:

Посмотреть класс контроллера для представления таблицы:

class PrototypeTableController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    let data = ["Cell1", "Cell2", "Cell3", "Cell4", "Cell5"] 
    let contents = ["Hello", "Nice", "OMG", "Jesus", "Peace"] 
    var content: String? 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return data.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell() 
     cell.textLabel?.text = data[indexPath.row] 
     return cell 
    } 

    func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { 
     return "This is a prototype table view created by Sweeper" 
    } 

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return "my table" 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     content = contents[indexPath.row] 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
     performSegueWithIdentifier("showContent", sender: tableView) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "showContent" { 
      let destination = segue.destinationViewController as! PrototypeTableContentViewController 
      destination.contentString = content 
     } 
    } 
} 

Просмотреть класс контроллера для Prototype Table Content вид:

class PrototypeTableContentViewController: UIViewController { 
    @IBOutlet var tableContent: UILabel! 
    var contentString: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableContent.text = contentString 
    } 
} 

Я думаю, что сделал все, что было предложено в упомянутом выше сообщении. Я добавил идентификатор, я вызвал performSegueWithIdentifier , я также снял выделение с ячейки после нажатия.

Однако он просто не подходит к другому контроллеру вида! Он остается на одном контроллере! Как это:

enter image description here

+0

контроллер точки зрения вместо добавления segue программно –

+0

нажатие не происходит, когда в таблице нет контроллера навигации @DivyanshuSharma –

+0

У меня есть контроллер просмотра навигации! @ Mr.T – Sweeper

ответ

3

Убедитесь, что ваш TableView делегат установлен. Если вы используете раскадровку, убедитесь, что выход делегата в раскадровку подключен правильно. Если вы создаете табличное представление по коду, вы должны сделать tableView.delegate=self;, чтобы установить делегат.

Ваш код в порядке.

И еще одна вещь:

Вы, возможно, потребуется изменить эту строку:

 performSegueWithIdentifier("showContent", sender: tableView) 

вам нужно сделать отправителя в качестве строки, но не TableView, так что подготовиться к Segue получите отправитель как строка, а не целая таблица.

Поскольку вы вызываете надстройку prepareForSegue, вы выбираете строку, имеет смысл сделать строку в качестве отправителя в performSegueWithIdentifier.

Так было бы:

  let row=indexPAth.row 
      performSegueWithIdentifier("showContent", sender: row) 
3

Когда пользователь нажимает на одну из ячеек, я хочу другой вид контроллера, чтобы показать, называемый прототип Таблица Content. И другой текст будет показан, если вы нажмете на разные ячейки.

Хотя вы можете программным способом вызывать performSegueWithIdentifier, это очень сложно, что раскадровка может автоматически обрабатывать вас. Просто используйте серию раскадровки show из вашей ячейки прототипа до PrototypeTableContentViewController.

prepareForSegue знает, какая ячейка выбрана, поскольку ячейка отправителя. Все, что вам нужно сделать, это установить ContentString контроллера точки назначения.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    guard let controller = (segue.destinationViewController as? PrototypeTableContentViewController where segue.identifier == "showContent", let cell = sender as? UITableViewCell, textLabel = cell.textLabel else { 
     return 
    } 

    controller.contentString = textLabel.text 
} 

Это очень похоже на то, как шаблон, как Master-Detail перетекает из клетки, чтобы показать подробную информацию о клетке (хотя компания Apple использует indexPathForSelectedRow передать детали клеточные):

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let object = objects[indexPath.row] as! NSDate 
      let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
      controller.detailItem = object 
      controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
      controller.navigationItem.leftItemsSupplementBackButton = true 
     } 
    } 
} 

В любом case, SDK выполняет расписание для вас; не нужно было программно добавлять или выполнять программный переход segue.