2015-08-02 2 views
1

Я делаю форму, в которой есть en bunch из разных UITableViewCells с различными функциями, поэтому вместо того, чтобы загромождать мой UITableView класс с ode для каждого действия, я хотел реализовать каждую функцию на ячейках подкласса.Вызов UIActionSheet из подкласса UITableViewCell

Итак, у меня есть ячейка прямо сейчас, когда появляется сообщение UIActionSheet, но когда я ничего не слышу, даже если делегат установлен.

Является ли моя идея неправильной и будет ли другой способ лучше? Вот простой код.

import UIKit 
class STypeCell: UITableViewCell, UIActionSheetDelegate { 

    func chooseType() { 
     var sheet: UIActionSheet = UIActionSheet() 
     let title: String = "Please choose a course" 
     sheet.delegate = self 
     sheet.title = title 
     sheet.addButtonWithTitle("Cancel") 
     sheet.addButtonWithTitle("A course") 
     sheet.addButtonWithTitle("B course") 
     sheet.addButtonWithTitle("C course") 
     sheet.cancelButtonIndex = 0 
     sheet.showInView(self.superview) 
    } 

    func actionSheet(sheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 

    func actionSheet(actionSheet: UIActionSheet, willDismissWithButtonIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 

    func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 
+0

попробуйте показать вид действия в keywindow –

+0

Вам нужно будет добавить кнопку или другое действие события касания, чтобы создать свой лист действий. Быстрый вопрос, правда, вы повторно используете ячейки? Если это так, я предлагаю создать функцию для обработки этого запроса, который был порожден из didSelectRowAtIndexPath на контроллере представления, который имеет таблицу. –

+0

my tableview работает отлично, все, что я показываю, является подклассом одной из моих ячеек. В моем didSelectRowAtIndexPath я проверяю класс STypeCell, и если это так, я вызываю функцию selectType() в моей ячейке, которая показывает листок действий, но не запускает его делегат @thefredelement – magnuskahr

ответ

1

TableViewCell не должен иметь такой логики в нем в качестве MVC Patterned framework as iOS is one.

Если вы хотите повторно использовать эту логику, вы должны создать TableViewController (или ViewController), который вы используете подклассом. В методах делегата TableView, которые вы могли бы назвать своими действиями.

Пример:

class MySuperTableView: UITableViewController, UIActionSheetDelegate { 

// [...] 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     self.chooseType() 
    } 

    func chooseType() { 
     var sheet: UIActionSheet = UIActionSheet() 
     let title: String = "Please choose a course" 
     sheet.delegate = self 
     sheet.title = title 
     sheet.addButtonWithTitle("Cancel") 
     sheet.addButtonWithTitle("A course") 
     sheet.addButtonWithTitle("B course") 
     sheet.addButtonWithTitle("C course") 
     sheet.cancelButtonIndex = 0 
     sheet.showInView(self.view) 
    } 

    func actionSheet(sheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 

    func actionSheet(actionSheet: UIActionSheet, willDismissWithButtonIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 

    func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) { 
     println("this never gets called") 
    } 

// [...] 
} 

class MyChildTableView: MySuperTableView { 

// [...] 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     super.tableView(tableView, didSelectRowAtIndexPath: indexPath) 
    } 

// [...] 

} 

class MyOtherChildTableView: MySuperTableView { 

// [...] 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     super.tableView(tableView, didSelectRowAtIndexPath: indexPath) 
    } 

// [...] 

} 

Конечно логичнее бы помочь как: Какие строки прослушивается? У меня есть другие TableViewCells, к которым можно подключиться, и поэтому я должен проверить это?

+0

Как указано, все работает, за исключением получения обратных вызовов из моего листа действий, что означает, что мой рабочий стол отлично работает. Но вы сказали, что ключевое слово, о котором я просил, если uitableviewcell должен содержать такую ​​логику, о которой вы сказали, это не должно. Спасибо, я найду другой путь – magnuskahr

+0

Добро пожаловать. Попытайтесь оставить свои взгляды «немыми». Они несут ответственность за представление данных с моделей. Контролеры отвечают за отражение изменений вперед и назад. :) – ezcoding

+0

Пожалуйста, отметьте ответ как принято – ezcoding

Смежные вопросы