2015-03-05 4 views
1

Я работаю над своим первым приложением iOS, используя быстрый. Я пытаюсь загрузить значение из одного viewController в другое. Я использую протокол, но я не могу заставить его работать правильно. Я искал вокруг переполнения стека и в другом месте, но не смог найти ответ, который работает в моей ситуации.Swift Delegate и необязательно

Вот VC я пытаюсь вытащить значение из:

protocol AddHelperVCDelegate { 
    func didFinishAddingHelper(controller: AddHelperViewController) 
} 

class AddHelperViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext! 
    var fetchedResultsController:NSFetchedResultsController = NSFetchedResultsController() 

    var delegate:AddHelperVCDelegate! = nil 
    var helperBonus:NSNumber = 0 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     fetchedResultsController = getFetchResultsController() 
     fetchedResultsController.delegate = self 
     fetchedResultsController.performFetch(nil) 

     // Do any additional setup after loading the view. 
    } 
} 

А вот где я пытаюсь переместить значение (и вид) обратно протекающей ВК.

// UITableViewDelegate 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    var indexPathForRow = tableView.indexPathForSelectedRow() 
    println("indexPath for selected row is: \(indexPathForRow)") 

    let thisUser = fetchedResultsController.objectAtIndexPath(indexPath) as UserModel 
    var cell:UserCell = tableView.dequeueReusableCellWithIdentifier("helperCell") as UserCell 

    helperBonus = thisUser.effectiveCombat 
    helperBonus = Int(helperBonus) 

    println("helperBonus is: \(helperBonus)") 

    delegate.didFinishAddingHelper(self) 

} 

Если я делегат необязательный (delegate?.didFinishAddingHelper(self)), то ничего не происходит. Если у меня нет, я получаю сбой с сообщением об ошибке:

indexPath for selected row is: Optional(<NSIndexPath: 0xc000000000018016> {length = 2, path = 0 - 3}) 
helperBonus is: 0 
fatal error: unexpectedly found nil while unwrapping an Optional value 

Теперь, я знаю, я объявляю делегат как ноль, но это предел моего понимания того, что происходит. Мне нужно добавить значение в протекающей ВК в этой функции:

func didFinishAddingHelper(controller: AddHelperViewController) { 
    self.effectiveCombat = Int(controller.helperBonus) 
    controller.navigationController?.popViewControllerAnimated(true) 
} 

ответ

1

Катастрофа происходит потому, что AddHelperViewController «s delegate свойство nil. Это потому, что вы не устанавливаете его.

Где бы вы создать AddHelperViewController, установить его делегатом на следующей строке:

let addHelperVC = AddHelperViewController() 
addHelperVC.delegate = self 

Тогда при вызове delegate свойство, это будет указывать на контроллер вида, который его создал.

Если ваш AddHelperViewController создается с помощью раскадровки, установите delegate в prepareForSegue(_:sender:) метода, который собирается показать новый контроллер:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let vc = segue.destinationViewController as? AddHelperViewController { 
     // If we got here, vc is an AddHelperViewController 
     vc.delegate = self 
    } 
} 
+0

var delegate: AddHelperVCDelegate? let addHelperVC = AddHelperViewController() addHelperVC.delegate = self // эта строка бросает ошибку «Ожидаемое объявление»? Разве я не объявлял об этом на строчке? https: // github.com/omegabytes/MunchkinCompanion –

0
var delegate:AddHelperVCDelegate! = nil 

Должно быть

var delegate:AddHelperVCDelegate? 

It не работает, потому что вы используете !, что означает, что вы гарантируете, что, хотя он не может быть инициализирован во время классов init, к тому моменту, когда вы хотите его использовать, он не будет равен нулю.

Aaron Brager абсолютно прав, когда он говорит, что вам нужно установить свойство делегата.

С делегата объявлен факультативным (с ?), вы можете назвать это, только если объект не ноль (игнорируется в противном случае):

delegate?.didFinishAddingHelper(self) 

На стороне записки, вы можете также рассмотреть сделать delegate свойство weak, чтобы помочь избежать циклов сохранения.

+0

Я реализовал это вместе с информацией Аарона Брагера, но я все еще делаю что-то неправильно. addHelperVC.delegate = self // эта строка бросает ошибку «Ожидаемое объявление» –

+0

Комментирует: https://github.com/omegabytes/MunchkinCompanion/commit/ddca23a31eeabdade6c592b520f7da78243a4603#commitcomment-10084121 – cjwirth

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