如何修复错误:此类不符合键值编码,无法为键“tableView”设置属性。

61

我用Table ViewSegmented Control制作了一个应用程序,这是我第一次制作。我使用了一些代码和一些教程,但它并不起作用。当我运行我的应用程序时,它会崩溃,并显示日志中的此错误:

MyApplication [4928:336085] *由于未捕获的异常而终止应用程序 'NSUnknownKeyException',原因:'[setValue:forUndefinedKey:]:该类不符合键值编码兼容性键 tableView。' *第一个抛出调用堆栈:   (     0 CoreFoundation 0x000000010516fd85 __exceptionPreprocess + 165     1 libobjc.A.dylib 0x0000000105504deb objc_exception_throw + 48     2 CoreFoundation 0x000000010516f9c9-[NSException raise] + 9     3 Foundation 0x000000010364e19b-[NSObject(NSKeyValueCoding)setValue:forKey:] + 288     4 UIKit 0x0000000103c37d0c-[UIViewController setValue:forKey:] + 88     5 UIKit 0x0000000103e6e7fb-[UIRuntimeOutletConnection connect] + 109     6 CoreFoundation 0x00000001050a9890-[NSArray makeObjectsPerformSelector:] + 224     7 UIKit 0x0000000103e6d1de-[UINib instantiateWithOwner:options:] + 1864     8 UIKit 0x0000000103c3e8d6-[UIViewController _loadViewFromNibNamed:bundle:] + 381     9 UIKit 0x0000000103c3f202-[UIViewController loadView] + 178     10 UIKit 0x0000000103c3f560-[UIViewController loadViewIfRequired] + 138     11 UIKit 0x0000000103c3fcd3-[UIViewController view] + 27     12 UIKit 0x000000010440b024-[_UIFullscreenPresentationController _setPresentedViewController:] + 87     13 UIKit 0x0000000103c0f5ca-[UIPresentationController initWithPresentedViewController:presentingViewController:] + 133     14 UIKit 0x0000000103c525bb-[UIViewController _presentViewController:withAnimationController:completion:] + 4002     15 UIKit 0x0000000103c5585c-[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 489     16 UIKit 0x0000000103c5536b-[UIViewController presentViewController:animated:completion:] + 179     17 UIKit 0x00000001041feb8d__67- [UIStoryboardModalSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 243     18 UIKit 0x00000001041ec630-[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 460     19 UIKit 0x00000001041ec433-[UIStoryboardSegueTemplate _perform:] + 82     20 UIKit 0x00000001041ec6f7-[UIStoryboardSegueTemplate perform:] + 156     21 UIKit 0x0000000103aa6a8d-[UIApplication sendAction:to:from:forEvent:] + 92     22 UIKit 0x0000000103c19e67-[UIControl sendAction:to:forEvent:] + 67     23 UIKit 0x0000000103c1a143-[UIControl _sendActionsForEvents:withEvent:] + 327     24 UIKit 0x0000000103c19263-[UIControl touchesEnded:withEvent:] + 601     25 UIKit 0x0000000103b1999f-[UIWindow _sendTouchesForEvent:] + 835     26 UIKit 0x0000000103b1a6d4-[UIWindow sendEvent:] + 865     27 UIKit 0x0000000103ac5dc6-[UIApplication sendEvent:] + 263     28 UIKit 0x0000000103a9f553_UIApplicationHandleEventQueue + 6660    

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

let foodList:[String] = ["Bread", "Meat", "Pizza", "Other"]
let drinkList:[String] = ["Water", "Soda", "Juice", "Other"]

@IBOutlet weak var mySegmentedControl: UISegmentedControl!
@IBOutlet weak var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    var returnValue = 0

    switch(mySegmentedControl.selectedSegmentIndex) {
    case 0:
        returnValue = foodList.count
        break
    case 1:
        returnValue = drinkList.count
        break
    default:
        break
    }

    return returnValue
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let myCell = tableView.dequeueReusableCellWithIdentifier("myCells", forIndexPath: indexPath)

    switch(mySegmentedControl.selectedSegmentIndex) {
    case 0:
        myCell.textLabel!.text = foodList[indexPath.row]
        break
    case 1:
        myCell.textLabel!.text = drinkList[indexPath.row]
        break
    default:
        break
    }

    return myCell
}

@IBAction func segmentedControlActionChanged(sender: AnyObject) {
    myTableView.reloadData()  
}

这里是main.Storyboard

enter image description here

我已经多次检查了代码,但它不起作用。一开始我只使用了 Table View ,看了这个教程 (https://www.youtube.com/watch?v=ABVLSF3Vqdg) 后,我认为按照教程使用 Segmented Control 应该可以工作。但仍然无法正常工作。同样的代码,同样的错误。 有人能帮我吗?


1
请检查此链接:https://dev59.com/42kw5IYBdhLWcg3wE2dA - Sahil
1
我遇到了类似的问题。原因是我为我的应用程序创建了两个方案/目标,而视图控制器仅添加到其中一个方案/目标中,而我正在运行另一个方案/目标。将Viewcontroller类添加到所有的方案/目标中解决了这个问题。 - Umar Farooque
2个回答

126

您的故事板设置期望一个名为tableView的插座,但实际插座名称是myTableView

如果您在故事板中删除连接并重新连接到正确的变量名称,则可以解决问题。


3
如何“删除连接”? - pete
1
我的天啊,我必须在Storyboard上点击那个东西才能看到所有的连接并在那里删除它们吗?有没有一种界面可以向我展示Storyboard中哪些东西与代码中的哪些东西相连?我还听说过一个“.nib”文件,但我还没有找到它。 - pete
@pete 在代码中的 IBOutlet 声明将会告诉你它们是否已连接,但是它们不会告诉你哪些在 storyboard 中的元素连接到了不存在的变量。 - Phillip Mills
9
在Storyboard中右击你的按钮,在底部附近会显示一个Outlet。点击旁边的"x"将其从按钮上删除。 - Krystian Cybulski
“Nib”文件现在有一个.xib文件扩展名,因此它的命名不太准确。 - Peter Johnson

12

有没有可能在某个时候你将表视图的名称从“tableView”更改为“myTableView”?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接