2013-04-25 43 views
1

在iOS應用程序中,我需要將對象從一個視圖控制器傳遞到另一個視圖控制器,然後切換到新的視圖控制器。目標是簡單地傳遞信息。但是,該對象變成NULL,並且在下一個視圖出現時沒有任何信息。什麼?可能是原因?傳遞給另一個視圖控制器時對象變爲空

下面是我的代碼的一部分。

#pragma mark - Table view delegate 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BIDCourse *course = self.courses[indexPath.row]; 


    NSString *sub = course.subject; 

    BIDSubjectMainTwoViewController *subjectController=[[BIDSubjectMainTwoViewController alloc] init]; 

    subjectController.title = sub; 


    subjectController.course=course; 

    [self.navigationController pushViewController:subjectController animated:YES]; 
} 

BIDCourse *course是我的自定義子類NSObject,其中有一些NSStrings,它不是零,但是當我將它傳遞到下一個視圖控制器,它成爲NULL

+1

您正在使用什麼樣的內存管理實行委託?弧?你的課程設置如何?課程對象最有可能在使用之前被解除分配。請添加更多代碼,以使其可見。 – Kobski 2013-04-25 08:40:08

+0

合成對象過程。 – Balu 2013-04-25 08:41:23

+0

你在代碼中的某個地方分配嗎?我也有同樣的問題,只是你必須先分配它! – 2013-04-25 09:16:51

回答

1

我遇到了像你這樣的問題,當我將一個對象傳遞給另一個viewController時,它已經被釋放。

我覺得這是ARC的一個缺陷,ARC認爲你的subjectController可能沒用,所以它釋放了subjectController。將你的subjectController作爲一個屬性,所以當你將它傳遞給另一個viewController時ARC不會釋放它。

如:

#pragma mark - Table view delegate 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
BIDCourse *course = self.courses[indexPath.row]; 


NSString *sub = course.subject; 

_subjectController=[[BIDSubjectMainTwoViewController alloc] init]; 

_subjectController.title = sub; 


_subjectController.course=course; 

[self.navigationController pushViewController:_subjectController animated:YES]; 
} 
+0

它看起來好像這也適用於我的情況,但它不起作用。奇怪的是,我的NSLog在新視圖控制器中檢查「課程」之前,已經加入了上述代理方法,比如2013-04-25 05:12:07.681 Marks [71737:c07] course :(空) 2013-04-25 05:12:07.684 Marks [71737:c07] course:subject:英語numQ:10 Quizworth:1 numTest:5 testworth:7 midworth:25 finalworth:30 – 2013-04-25 09:16:05

0

莫非問題出在哪裏在BIDSubjectMainTwoViewController.m?

subjectController.title = sub; 
subjectController.course = course; 

在您的BIDSubjectMainTwoViewController.m文件中,您是否在@synthesize您的屬性?

@synthesize title = _title; 
@synthesize course = _course; 

您還可以通過變量以及INIT功能ALA:

BIDSubjectMainTwoViewController.h

- (id)initWithTitle:(NSString *)title 
      andCourse:(BIDCourse *)course; 

BIDSubjectMainTwoViewController.m

- (id)initWithTitle:(NSString *)title 
      andCourse:(BIDCourse *)course 
{ 
    self = [super init]; 
    if (self) { 
     // Custom initialization 
     _title=title; 
     _course = course; 
    } 
    return self; 
} 
+0

謝謝,但是當我嘗試使用initWithTitle。 。方法,問題仍然存在 – 2013-04-25 09:04:08

+1

Xcode自動綜合ivars的屬性 – Kreiri 2013-04-25 10:16:08

0

我遇到過這種類似的行爲。我的解決方案是製作對象的副本。爲您的情況:

BIDCourse *course = [self.courses[indexPath.row] copy]; 

並確保您在BIDCourse .m fike中實現copyWithZone。

-(id)copyWithZone:(NSZone*) zone 
+0

爲什麼不會強大的工作? – Mar0ux 2013-04-26 12:39:23

0

試試這個:

BIDSubjectMainTwoViewController.h

NSString *strTemp; 

    @property(nonatomic,retain) NSString *strTemp; 

    -(void) setValuestrTemp : (NSString *) str; 

.m文件

@synthesize strTemp; 

//寫setter方法

-(void) setValuestrTemp : (NSString *) str { 
     self.strTemp = str; 
    } 

並在viewWillAppear中使用strTemp。

//現在使用它

BIDSubjectMainTwoViewController *subjectController=[[BIDSubjectMainTwoViewController alloc] init]; 

     [subjectController setValuestrTemp:sub]; 

    [self.navigationController pushViewController:_subjectController animated:YES]; 
0

使用

NSString *sub = [course.subject copy]; 
    subjectController.course=[course copy]; 

BIDCourse

-(id)copyWithZone:(NSZone*) zone 
相關問題