【问题标题】:Cannot set values to an object in iOS无法在 iOS 中为对象设置值
【发布时间】:2013-01-19 13:21:24
【问题描述】:

我是 iOS 开发新手。

我有一个类叫宠物

@interface Pet : NSObject
@property(nonatomic, strong) NSString *petName;
@property(nonatomic, strong) NSString *petBreed;
@end

在我的一种方法中,我试图为 Pet 类型的已声明对象设置值:

Pet *selectedPet;

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{        
UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath];
NSString *currentPetTemp,*currentBreedTemp;
currentPetTemp = cell.textLabel.text;
currentBreedTemp = cell.detailTextLabel.text;
selectedPet.petName = currentPetTemp;
selectedPet.petBreed = currentBreedTemp;
NSLog(@"%@ Name1: %@",selectedPet.petName,currentPetTemp);

return indexPath;

}

NSLog 显示“currentPetTemp”的正确值,但 selectedPet.petName 显示“null”。

任何帮助将不胜感激。

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

    你还没有初始化它......请执行以下操作:

    Pet *selectedPet=[[Pet alloc]init];
    

    或者,

     Pet *selectedPet=[Pet new];
    

    编辑:

    根据您的评论Initializer element is not a compile time constant,当您在任何方法范围之外定义变量时,会显示此警告。此位置仅用于常量值。

    需要在viewDidLoad/init/awakeFromNib中alloc-init。

    【讨论】:

    • 谢谢,但现在它给出了一个错误“Initializer element is not a compile time constant”。
    • new 不是 Objective-c 中的常规构造方法名称。如果要创建一个 Class 方法来创建我们对象的空实例,我们应该遵循 NSArray 等人的示例并创建方法 +(instancetype)pet 调用如下:[Pet pet];
    • 我使用new 作为我的编码风格,除非要提供一些默认值。
    • @AnoopVaidya 定义任何方法范围之外的变量都不会产生您引用的错误。将变量初始化为非常量(如新实例)是问题所在。
    • @JesseRusak:我阅读并使用了stackoverflow.com/questions/6143107/…的那部分
    【解决方案2】:

    有两个问题。第一个是您的Pet *selectedPet; 代码行的位置。如果您只是将它放在类似方法之外的 .m 文件中,它将是一个全局变量;这可能不是你想要的。您可能希望将其设为实例变量。比如,在你的 .m 文件的顶部:

    @implementation MyViewController {
        Pet *selectedPet;
    }
    

    第二个问题是selectedPet的默认值为nil;也就是说,它是空的。你需要先初始化它。我会建议这样的东西,它创建一个新的宠物对象,然后设置名称和品种:

    -(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {        
        UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath];
        selectedPet = [[Pet alloc] init];
        selectedPet.petName = cell.textLabel.text;
        selectedPet.petBreed = cell.detailTextLabel.text;
        NSLog(@"%@ Name1: %@",selectedPet.petName,currentPetTemp);
    
        return indexPath;
    }
    

    (假设您使用的是 ARC;否则,您需要进行一些内存管理。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多