2016-07-16 3 views
-1

Я начал проект типа iOS типа Master-Detail в Xcode.Управление потоком Master-Detail

У меня есть MasterViewController и DetailViewController, работающий, как я ожидаю.

Вот что я хочу знать, как это сделать, используя хорошую практику.

Обычное поведение заключается в том, что при нажатии на элемент в главном представлении таблицы DetailViewController срабатывает и выполняет свою работу.

Но есть случаи, когда вещи не готовы, и я не хочу, чтобы DetailViewController отображался. Я просто не хочу, чтобы что-то случилось, или я хочу, чтобы что-то еще произошло. Как я могу это сделать? И какой лучший (стандартный) способ сделать это?

В псевдокоде я хотел бы что-то вроде:

if situation-is-not-good { 
    do-some-other-things 
} else { 
    Start-DetailViewController-Normally 
} 
+2

Просто сделай это. В чем проблема? – matt

+0

Вы должны начать с того, что попробуете сами и зададите вопрос здесь, когда у вас проблемы с чем-то. –

+0

«Просто сделай это»: что такое «это»? «Владимир Нул»: Спасибо, что подумал, что я ничего не пробовал сам. Если я трачу время, чтобы написать сообщение, это именно потому, что я пробовал несколько вещей, и это не сработало. Когда вы пишете «потому что у меня проблемы». – Michel

ответ

1

Поскольку вы начали с Master-Detail шаблон, вы используете SEGUE с идентификатором "showDetail" для перехода к Detail View Controller в. iOS предоставляет вам возможность вставить процесс принятия решения о том, следует ли выполнять этот переход при выборе строки.

Переопределите shouldPerformSegueWithIdentifier(_:sender:) и введите свою логику там. Верните true, если вы хотите, чтобы segue продолжался или false, если вы хотите пропустить segue.

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { 
    if identifier == "showDetail" { 
     if situation-is-not-good { 
      // do-some-other-things 

      // if you don't let the segue proceed, then the cell remains 
      // selected, so you have to turn off the selection yourself 
      if let cell = sender as? UITableViewCell { 
       cell.selected = false 
      } 

      return false // tell iOS not to perform the segue 
     } 
    } 

    return true // tell iOS to perform the segue 
} 
+0

Большое спасибо, он работает. Интересная часть: я нашел другое решение самостоятельно и с помощью переопределения другого метода: func tableView (tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? '. Я возвращаю ноль, когда ситуация-не-хорошая и indexPath в противном случае. – Michel

+0

Интересно. Вы можете публиковать ответы на свой вопрос. Эта информация может помочь будущим программистам найти этот вопрос. – vacawama

+0

Да, я когда-нибудь это сделаю. В этом конкретном случае ваше решение так же просто и ясно, как и мое. Я не знаю, можно ли считать его лучшей практикой. – Michel

1

Вот один из возможных решений:

override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { 
    let theCell = self.tableView.cellForRowAtIndexPath(indexPath) 
    if situation-is-not-good for theCell { 
     // Do-Whatever-Is-Needed 
     return nil 
    } else { 
     return indexPath 
    } 
} 
Смежные вопросы