【问题标题】:cannot pass the obj-c class obj to another view无法将 obj-c 类 obj 传递给另一个视图
【发布时间】:2012-02-03 12:44:03
【问题描述】:

我有 3 节课

第一个 -> MainViewController:

@interface MainViewController : UIViewController {
    UtilityBadah *utility;

    }
    @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    - (IBAction)option;
    @end

    @implementation MainViewController
    @synthesize managedObjectContext = _managedObjectContext;
    (IBAction)option{
    UtilityBadah *util = [[UtilityBadah alloc] initWithContext:_managedObjectContext];
    OptionController *ovc = [[OptionController alloc] init];
    ovc.util = util;
    ovc.managedObjectContext = _managedObjectContext;    
    [self.navigationController pushViewController:ovc animated:YES];
    [util release];
    [ovc release];
    }

    @end

第二 -> UtilityBadah:

@interface UtilityBadah : NSObject {

NSManagedObjectContext *managedObjectContext;
NSString *kitab;
NSString *lagu;
NSString *font;
NSString *sizefont;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSString *kitab;
@property (nonatomic, retain) NSString *lagu;
@property (nonatomic, retain) NSString *font;
@property (nonatomic, retain) NSString *sizefont;
(id) initWithContext: (NSManagedObjectContext *) context;
@end

@implementation UtilityBadah
@synthesize managedObjectContext;
@synthesize kitab;
@synthesize lagu;
@synthesize font;
@synthesize sizefont;

-(id) initWithContext: (NSManagedObjectContext *) context {
NSError *err;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *enDesc = [NSEntityDescription entityForName:@"OptionDB" inManagedObjectContext:context];
[request setEntity:enDesc];
NSArray *arrData = [context executeFetchRequest:request error:&err];

for (OptionDB *data in arrData) {
lagu = data.lagu;
kitab = data.kitab;
font = data.font;
sizefont = data.sizefont;
}
return self;
} 

第三 -> 选项控制器:

@interface OptionController : UIViewController{

    NSManagedObjectContext *managedObjectContext;
    UtilityBadah *util;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) UtilityBadah *util;
@end

(UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    bla..bla..

    NSLog(@"value is %@",self.util.kitab);
    cell.textLabel.text = [listData objectAtIndex:row];    
    return cell;
}

我想知道为什么这段代码:

NSLog(@"value is %@",self.util.kitab);

导致错误“收到信号:“EXC_BAD_ACCESS”? 我想知道我将 UtilityBadah 对象从 MainViewController 传递到我的 OptionController 的方式有什么问题。

非常感谢您的任何回答。

P.S 我的 xcode 4.2 错误信息有什么问题,为什么它总是显示“程序接收信号:“EXC BAD ACCESS”?不能提供信息吗?

【问题讨论】:

  • 如果你尝试这个会发生什么:NSLog(@"util is: %@", self.util);
  • 这不是错误,但它显示:2012-02-03 20:12:12.137 iBadah[13981:207] util 是:<0x6d121d0>

标签: iphone objective-c oop object


【解决方案1】:

我认为您的 init 方法是错误的,请尝试在开始时将 self 分配给 [super init],并在检查 self != nil 后进行所有设置。这是 init 的基本形式:

- (id)init
{
    self = [super init];
    if (self)
        //do setup
    return self;
}

另外,您正在使用NSObject 的子类并将托管对象上下文关联到它,您应该更详细地查看核心数据,您应该使用NSManagedObjects

【讨论】:

  • 我按照您的建议更改了我的 init 方法,但仍然没有运气。无论如何,关于 nsmanageobject 而不是 nsmanageobjectcontext,你能给我任何关于这个的好文章,所以我可以学习(在互联网上少谈论它)?交易
【解决方案2】:

OptionController 中的属性名称是 util 而不是 utility

如果您想访问 UtilityBadah 类中的 utility 属性,您必须这样做:

self.util.utility

【讨论】:

  • 对不起 Oscar,我使用的是 util 而不是实用程序(我的错),只需更新程序
  • 我的意思是,我使用了 util,但它是错误的。 (只是在本论坛上写错了)
【解决方案3】:

UtilityBadah类的initWithContext方法中,修改for循环如下

for (OptionDB *data in arrData) {
  self.lagu = data.lagu;
  self.kitab = data.kitab;
  self.font = data.font;
  self.sizefont = data.sizefont;
}

在您的情况下,该值不会保留,因为您在没有通过属性访问的情况下进行了分配。

【讨论】:

  • 在那个循环中,只会保留最后的数据。
  • 首先我是这样做的,是的,这段代码 -> self.lagu = data.lagu;导致错误 -> 程序收到信号:SIGABRT
【解决方案4】:

您需要先分配这些对象。下面是您的 initWithContext 方法的外观:

-(id) initWithContext: (NSManagedObjectContext *) context {
    self = [super init];
    if (self) {
        NSError *err;
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *enDesc = [NSEntityDescription entityForName:@"OptionDB" inManagedObjectContext:context];
        [request setEntity:enDesc];
        NSArray *arrData = [context executeFetchRequest:request error:&err];

        for (OptionDB *data in arrData) {
            self.lagu = [NSString stringWithString:data.lagu];
            self.kitab = [NSString stringWithString:data.kitab];
            self.font = [NSString stringWithString:data.font];
            self.sizefont = [NSString stringWithString:data.sizefont];
        }
    }
    return self;
}

【讨论】:

  • 这个结果与 Lanc 的答案相同:(
  • 结果如何? SIGABRT?
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2020-07-09
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多