1

Xcode 似乎没有找到给定 UITableViewController 的属性,即使我正在导入它并且它们似乎在类上正确定义。

我尝试清理、删除派生数据、重新启动 XCode 并再次构建,但这些都不起作用。还尝试通过设置器访问该属性。

这是我的代码:

主视图控制器.m

#import "DetailTableViewController.h"
...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"nextScreen"]) {
    DetailTableViewController *detailTableViewController = [segue destinationViewController];
    NSInteger tagIndex = [(UIButton *)sender tag];
    detailTableViewController.productType = tagIndex;

    /*[detailTableViewController setProductType:tagIndex];*/ //This does not work either.
 } else  if ([[segue identifier] isEqualToString:@"anotherSegue"]){
    MyLoginViewController *loginViewController = [segue destinationViewController];
    loginViewController.delegate = self; //Funnily enough, this one works
 }
}

DetailTableViewController.h #import

@interface DetailTableViewController : UITableViewController<UITableViewDelegate, UITableViewDataSource> {
    NSInteger *productType;
}

 @property (nonatomic) NSInteger *productType;

@end

DetailTableViewController.m

@implementation DetailTableViewController

@synthesize productType = _productType;
...

编辑:错误出现在这一行:

detailTableViewController.productType = tagIndex;

有谁知道为什么会发生这种情况?谢谢!

更新:

看起来这与 XCode 如何引用我的文件有关,这真的很奇怪:

  • 当我 cmd + 单击 detailTableViewController(我创建实例的地方)时,它会将我带到我的实际代码:

     detailTableViewController *detailTableViewController = [segue destinationViewController];
    
  • 但是当我 cmd + 单击导入行时,它会将我带到一些与我的名称相同的界面,以及相同的声明,但它没有我的代码所具有的任何属性。

    #import "DetailTableViewController.h"
    

有没有人经历过同样的问题?

4

4 回答 4

3

解决了!

所以基本上,我可以发现 Finder 中的文件有两个副本,一个在我项目的根文件夹中,另一个在源文件夹中。

无法理解为什么会发生这种情况,或者我是否无意复制了文件,但现在它可以正常工作了。

感谢大家的回答!

于 2012-10-17T11:04:40.297 回答
0

将您的详细控制器命名为类以外的其他名称(非常明显)。

detailTableViewController *detailTableViewController

为了:

detailTableViewController *detailTable
于 2012-10-16T16:37:00.993 回答
0

detailTableViewController 是否嵌入在导航控制器中?如果是这样,您将需要以这种方式访问​​它:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"nextScreen"]) {
    UINavigationController *nc = segue.destinationViewController;
    DetailTableViewController * detailTableViewController = [nc.viewControllers objectAtIndex:0]; // First view in nav controller
    NSInteger tagIndex = [(UIButton *)sender tag];
    detailTableViewController.productType = tagIndex;
}
于 2012-10-16T16:41:13.073 回答
0

您应该[segue destinationViewController]转换为您需要的任何类型的控制器,因为该方法返回一个泛型UIViewController(它不知道您希望它是什么类型的类,这就是您需要转换它的原因)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"nextScreen"]) {

        // cast destinationViewController to DetailTableViewController
        DetailTableViewController *detailTableViewController = (DetailTableViewController*)[segue destinationViewController];
        NSInteger tagIndex = [(UIButton *)sender tag];

        detailTableViewController.productType = tagIndex;

    } else if ([[segue identifier] isEqualToString:@"anotherSegue"]) {

        // cast destinationViewController to MyLoginViewController
        MyLoginViewController *loginViewController = (MyLoginViewController*)[segue destinationViewController];
        loginViewController.delegate = self;

    }
}

这应该够了吧。

于 2012-10-16T17:05:01.877 回答