0

所以我拥有的是一个我希望能够在另一个类中访问的 NSString。在我的 RootViewController.h 我有:

@interface RootViewController : UITableViewController

+(NSMutableString*)MY_STR;

@property (nonatomic, readwrite, retain) NSString *MY_STR;

@end

在我的 RootViewController.m 中:

static NSString* MY_STR;

@synthesize MY_STR;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //The NSDictionary and NSArray items (listOfItems, etc.) are called at top so don't worry about them

    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"MovieTitles"];
    MY_STR = [array objectAtIndex:indexPath.row];

}

+(NSString*)MY_STR{
    return MY_STR;
}

- (void)dealloc {
    [MY_STR release];
    [super dealloc];
}

现在在我的 NewViewController 类中,我想写入 NSString MY_STR 所以在我的 .m 中我有:

#import "RootViewController.h"

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"MovieTitles"];
    [RootViewController MY_STR] = [array objectAtIndex:indexPath.row];
}

但在这一行:

[RootViewController MY_STR] = [array objectAtIndex:indexPath.row];

我收到此错误:“分配给 'readonly' 不允许返回 Objective-c 消息的结果”

任何帮助都会很棒,谢谢!

4

1 回答 1

0

属性名称需要以小写字符开头。按照惯例,所有大写名称都是“#defines”。改用“myStr”。

所以这条线是你的问题:

[RootViewController MY_STR] = [数组 objectAtIndex:indexPath.row];

左侧只是返回一个值而不是左值。你需要做的是添加

+(void) setMyStr:(NSString*)str
{
   myStr = str; // assumes ARC
}

然后

[RootViewController setMyStr:[array objectAtIndex:indexPath.row]];

您可能还没有接触到键值编码或属性,但是为了方便 ObjectiveC 使用命名约定来完成这些。所有 ivars 都应该以小写字母开头,原因是 setter 使用的变量名的第一个字母大写,并以“set”为前缀。因此,使用“myStr”作为变量名(很好的 CamelCase 示例,同样是 Apple 方式),您有一个“setMyStr:”的设置器。现在在你的情况下,你只在类中使用这两种方法,你真的可以使用你想要的任何方法名称——但它很好地投入实践。当你使用属性,并让编译器为你合成 getter 和 setter 时,它看起来就像上图一样。

于 2012-08-07T22:02:21.093 回答