2016-09-06 4 views
-3

У меня странная проблема с тем же делегатом (-ами) среди некоторых методов в ViewController.swift. Например:Быстрая проблема с делегатом среди двух методов

У нас есть ViewController класс с ToDoItemsDelegate, такие как это:

ViewController.swift

class ViewController: UIViewController, ToDoItemsDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let todoitemsDelegate = ToDoItems(delegate: self) 

     print("Part 1: How many to do items?: \(todoitemsDelegate.items.count)") 

     secondPart() 
    } 

    func secondPart() { 

     let todoitemsDelegate = ToDoItems(delegate: self) 

     print("Part 2: How many to do items?: \(todoitemsDelegate.items.count)") 
    } 
} 

Выход:

Part 1: How many to do items?: 5 
Part 2: How many to do items?: 0 

Я не понимаю, почему метод secondPart() не дает правильное число, как первый метод " Первая часть: 5 ". Нет подсказки ... Это должно быть работой, если у вас есть делегат для работы среди методов в ViewController. Я попытался создать дополнительный делегат, и он поступил так же. Любая идея, что с ним не так? Любое предложение оценили. Благодаря!

Edited (я добавил больше деталей)

ToDoItems.swift

protocol ToDoItemsDelegate { 

} 

struct Item { 

    var title: String! 
    var description: Int! 

} 

class ToDoItems { 

    let delegate: ToDoItemsDelegate 

    init(delegate: ToDoItemsDelegate) { 
      self.delegate = delegate 
    } 

    var items = [Item]() 

} 
+0

Ваш оператор печати в 'secondPart' не относится к экземпляру, который вы создаете в этой функции, это не похоже на то, что ваш текущий код должен даже компилироваться. – dan

+1

Не совсем ясно, что вы пытаетесь выполнить с делегатами. – picciano

+0

@picciano не понимает, почему у меня есть метод 'secondPart', но только 0 элементов, а не 5 элементов, таких как' first method' – HotDudeSmith

ответ

0

Вы должны сделать следующее. todoitemsDelegate объявляется вне функций, а затем назначается в viewDidLoad, прежде чем он будет использоваться. Теперь он будет печатать одинаковое значение оба раза (0, как ожидалось):

class ViewController: UIViewController, ToDoItemsDelegate { 

    var todoitemsDelegate : ToDoItems? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     todoitemsDelegate = ToDoItems(delegate: self) 

     print("Part 1: How many to do items?: \(todoitemsDelegate!.items.count)") 

     secondPart() 
    } 

    func secondPart() { 

     print("Part 2: How many to do items?: \(todoitemsDelegate!.items.count)") 
    } 
} 
+0

Я пробовал это, и он не дает права из-за ошибки. Когда я переместил его за пределы функций. Вот что я получил ошибку: «Тип аргумента» NSObject ->() -> ViewController не соответствует ожидаемому типу ToDoItemsDelegate'' Любая идея, что с ним не так? – HotDudeSmith

+0

Это помогло бы, если бы я знал, чем был ваш делегат. Ваш вопрос непонятен. – WMios

+0

У меня есть класс ToDoItems с помощью Struct и других методов func. Если я не использую делегат для передачи значения между классом ToDoItems и UIViewController. У меня никаких данных нет. Поэтому я добавил протокол в ToDoItems, чтобы я мог взять данные оттуда, чтобы перейти к UIViewController. Он работал только в методе 'viewDidLoad()', но не в методе 'secondPart()'. – HotDudeSmith

0

Вы создаете два разных ToDoItems. ToDoItems != self

Каждый раз, когда вы назначаете новый ToDoItems, вы инициализируете свойства нового элемента. т.е. var items = [Item]()

todoitemsDelegate в viewDidLoad и todoitemsDelegate secondPart различные объекты и имеют два различных элемента переменных.