我的项目未显示在TableView中

时间:2016-10-14 13:58:28

标签: ios swift uitableview

问题:我添加" todo"然后单击"保存",TodoTableView中未列出新待办事项。

完整代码:https://github.com/gkatsanos/todolist-swift

我正在关注苹果make your first app guide但是使用XCode 8(Swift 3) - 所以我怀疑一些代码已经改变了。

特别是这部分:

@IBAction func unwindToMealList(sender: UIStoryboardSegue) {
    if let sourceViewController = sender.sourceViewController as? MealViewController, meal = sourceViewController.meal {
        // Add a new meal.
        let newIndexPath = NSIndexPath(forRow: meals.count, inSection: 0)
        meals.append(meal)
        tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom)
    }
}

我更正了:

@IBAction func unwindToTodoList(sender: UIStoryboardSegue) {
    if let source = sender.source as? TodoViewController, let todo = source.todo {
        // Add a new todo.
        let newIndexPath = IndexPath(row: todos.count, section: 0)
        todos.append(todo)
        tableView.insertRows(at: [newIndexPath], with: UITableViewRowAnimation .bottom)
    }
}

(我稍微改变了做例#34; Todos"而不是吃饭。)

我正在运行我,并为该方法设置断点,if永远不会评估为true,因此我的新待办事项未保存。

我使用断点并检查变量并看到我输入的文本位于sender.source(@TEST)enter image description here

中的某处

这是Todo.swift基类:

class Todo {
    // MARK: Properties

    var name: String

    // MARK: Initialization

    init?(name: String) {
        self.name = name
        if (name.isEmpty || name == "") {
            return nil
        }
    }
}

3 个答案:

答案 0 :(得分:1)

问题是todo为空。您有一个文本字段,但是您尝试从属性中获取文本。将此属性更改为计算属性,并在getter中返回文本字段的文本。

像这样改变:

var todo?: Todo {
    get {
        return Todo(name: nameTextField.text)
    }
}

答案 1 :(得分:0)

正如@Leo指出的那样,todo unwind viewController时,TodoViewController为空。您可以在todo中使用一种操作方法,在其中为 @IBAction func AddTodo(_ sender: AnyObject) { if let name = nameTextField.text , !name.isEmpty { todo = Todo(name: name) saveButton.isEnabled = true } } 分配值。试试这个:

unwind

另一个选项是textField's value in this method and add your,您可以获得@IBAction func unwindToTodoList(sender: UIStoryboardSegue) { if let sourceViewController = sender.source as? TodoViewController { if let name = sourceViewController.nameTextField.text { sourceViewController.todo = Todo(name: name) let newIndexPath = IndexPath(row: todos.count, section: 0) if let todo = sourceViewController.todo { todos.append(todo) tableView.insertRows(at: [newIndexPath], with: UITableViewRowAnimation.bottom) } } } } 待办事项。

$scope.submitForm = function() {    
      //check to make sure the form is completely valid
       if ($scope.userForm.$valid) {
         alert('our form is amazing');
       }

}; 
$scope.openCancelDialog = function(){
   //alert('why am not showing CAncel');
   ModalService.openModal('Analysis Error', 'I am Error Type', 'Error');
 }


 $scope.openErrorDialog = function(){
    //alert('why am not showing Error');
    ModalService.openModal('Analysis Error', 'I am cancel Type', 'Cancel');
 }

答案 2 :(得分:0)

我能够修复指南建议的实际代码,执行以下操作:

// This method lets you configure a view controller before it's presented.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let name = nameTextField.text ?? ""

        // Set the todo to be passed to TodoTableViewController after the unwind segue.
        todo = Todo(name: name)
}

要使override生效,我必须将发件人更改为Any类型,而不是AnyObject,我删除了条件。

它是我能够获得Apple Start Developing iOS Apps guide

提供的代码的最接近的代码