2013-04-02 45 views
0

NSObject類使用NSString我有NSObject類是有一個叫NSString的tweetTitle;如何從多個類(視圖控制器)

TweetDesc.h文件

#import <Foundation/Foundation.h> 

@interface TweetDesc : NSObject 

@property (strong, nonatomic) NSString * tweetTitle; 

-(void) setFullTweetTitle:(NSString *) fullTweetTitle; 
@end 

TweetDesc.m文件

@implementation TweetDesc 
@synthesize tweetTitle; 

-(void) setFullTweetTitle:(NSString *) fullTweetTitle 
{ 
    self.tweetTitle = fullTweetTitle; 
} 
@end 

我有三個類(視圖控制器),FirstViewController,SecondViewController和ThirdViewController。

這裏有FirstViewController 的代碼FirstViewController.h

@interface TweetViewController : UIViewController <UITextViewDelegate> 
@property (strong, nonatomic) NSString * tweet; 
@property (weak, nonatomic) IBOutlet UITextView *tvTweetTitle; 
- (IBAction)btnCreateTweet:(id)sender; 
@end 

FirstViewController.m

@implementation TweetViewController 
@synthesize tvTweetTitle, tweet; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.tvTweetTitle.delegate = self; 
} 

- (IBAction)btnCreateTweet:(id)sender 
{ 
    tweet = [[NSString alloc]initWithFormat:@"%@", tvTweetTitle.text]; 

    TweetDesc * td = [[TweetDesc alloc]init]; 
    [td setFullTweetTitle:tweet]; 

    SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    [self.navigationController pushViewController:ivc animated:YES]; 
} 

我的問題是:如何使用tweetTitle在第二和第三的ViewController而無需創建新實例TweetDesc類,並在每個ViewControler中再次設置tweetTitle。

在第二視圖控制器我想:

TweetDesc * td = [[TweetDesc alloc]init]; 
NSLog(@"%@", td.tweetTitle); 

,但我得到空,似乎它已經被釋放或別的東西。

感謝提前的幫助。

+0

for secondViewController當你寫'TweetDesc * td = [[TweetDesc alloc] init];'你還沒有分配任何值給實例變量'tweetTitle'因此爲空。如果你寫'[td setFullTweetTitle:@「some string」];'_THEN_它被分配一個值。 –

回答

1

第一件事,你不需要爲一類:

- (IBAction)btnCreateTweet:(id)sender 
{ 
    tweet = [[NSString alloc]initWithFormat:@"%@", tvTweetTitle.text]; 

    TweetDesc * td = [[TweetDesc alloc]init]; 
    [td setFullTweetTitle:tweet]; 
    [[[UIApplication sharedApplication] delegate] setTd:td]; 

    SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    [self.navigationController pushViewController:ivc animated:YES]; 
} 

而在你的第二個和第三個視圖控制器,你可以使用獲得價值單一屬性僅使用字符串。有幾種方法可以做到這一點。

  • 首先,你可以在的AppDelegate全局定義鳴叫屬性。
  • 您可以通過從一個到另一個viewcontrolleres變量引用。
  • 或者,你可以使用NSUserDefaults的設置和獲取文本。

在你的情況首先是更加有用。只要做到如下

在AppDelegate.h

定義財產的NSString * tweetText;

現在,在你行動

- (IBAction)btnCreateTweet:(id)sender 
{ 
    AppDelegate *appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.tweetText=tvTweetTitle.text; 
} 

然後在您要訪問的值的任何控制器只需使用

AppDelegate *appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSLog("%@",appDelegate.tweetText); 

同樣的方法也可以用於NSUserDefaults的作爲設定值

[[NSUserDefaults standardUserDefaults] setObject:tvTweetTitle.text forKey:@"Tweet"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

,並獲得

NSLog("%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"Tweet"]); 

確保您導航到其他控制器之前的設置值..

以上應該可以解決你的目的..

+0

謝謝,它工作得很好。 – iMubarak

+0

如果解決了,你可以選擇這個答案。它會幫助其他人找出答案。謝謝。 – iphonic

+0

@Downvoter:請解釋!謝謝。 – iphonic

0

您需要使用的地方創建方法,增加了您的默認標題TweetDesccategory。或者,您可以創建總是擁有一個標題的單身人士TweetDesc

+3

辛格爾頓不是一個好主意,因爲他可能想要多個'TweetDesc'。將指針作爲參數傳遞是個好主意。 –

0

在你ViewController創建一個名爲initWithTweetDesc方法。該方法是這樣的:

- (id)initWithTweetDesc:(TweetDesc*)tweet 
{ 
    self = [super init]; 
    if (self) { 
     _tweet = tweet; 
    } 
    return self; 
} 

現在,當你想要移動到新的視圖控制器,運行此代碼:

TweetViewController *vc = [[TweetViewController alloc] initWithTweetDesc:tweetDesc]; 
[self.navigationController pushViewController:vc animated:YES]; 
+0

他從故事板實例化'SecondViewController'。創建一個自定義的init方法將不起作用,因爲他必須使用'instantiateViewControllerWithIdentifier:'來創建它,而不是自定義的init方法。 –

+0

他已經提到過:**沒有創建TweetDesc類的新實例並在每個ViewControler中再次設置tweetTitle **您的解決方案需要在每個視圖控制器中聲明'TweetDesc'屬性。 –

0

您可以使用您的AppDelegate這一點。

eclare在AppDelegate.h文件屬性@property(nonatomic, strong) TweetDesc * td;

和變革,如方法:

TweetDesc *desc = [[[UIApplication sharedApplication] delegate] td]; 
NSLog(@"%@",desc.fullTweetTitle); 
+2

另一個不好的主意。爲什麼他需要使用AppDelegate來傳遞一個簡單的指針?如果他需要第二個或第三個TweetDesc,該怎麼辦?在AppDelegate中創建另外2個屬性? –

+0

@EliGanem:OP只需要在第二個和第三個viewControllers中傳遞Tweet對象,而不在這些視圖控制器中聲明屬性。所以我認爲這是做到這一點的最佳方式之一。如果他需要更多的對象,他可以在每個類中聲明屬性,也可以在AppDelegate中聲明一個數組。我根據他的問題回答。如果他需要更多,他需要修改它。這只是一個建議。 –

2

只要給SecondViewController一個TweetDesc屬性,像這樣:

@interface TweetDesc : UIViewController 

@property (nonatomic, strong) TweetDesc *tweetDesc; 

... 

然後,在您實例化SecondViewController後,將其設置爲tweetDesc屬性:

SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
svc.tweetDesc = td; 
[self.navigationController pushViewController:svc animated:YES]; 

在您的SecondViewController實現中,使用self.tweetDesc來訪問實例。

+0

我喜歡這個答案,它在第二個視圖控制器上工作得很好。但它不適用於第三個視圖控制器。這個想法是從視圖控制器1收集一些數據並存儲它tweetDesc它們移動到視圖控制器2並收集一些數據並存儲它們並最終在視圖控制器3中檢索它們。 – iMubarak

1

根據你的評論,我覺得你想讓你的每個視圖控制器都擁有一個TweetDesc對象。爲了你可以有一個基類如

@interface baseViewController:UIViewController 
@property(strong, nonatomic)TweetDesc *td; 
@end 

所有的viewcontrollers應該從這個基類派生。這樣你的控制器定義這個樣子的 -

@interface FirstViewController:baseViewController 
... 
@end 

@interface SecondViewController:baseViewController 
... 
@end 

@interface ThirdViewController:baseViewController 
... 
@end 

ü初始化它在FirstViewController -

TweetDesc * td = [[TweetDesc alloc]init]; 
[td setFullTweetTitle:@"whatever string you want"]; 

並把它傳遞給SecondViewController - 在羅布Mayoff的答案//像

SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
svc.tweetDesc = td; 
[self.navigationController pushViewController:svc animated:YES]; 

INSIDE SecondViewController您可以將其引用爲self.tweetDesc。並把它傳給你想這個使用上面的代碼後,取其視圖 - 控制。

ThirdViewController *third= [self.storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController "]; 
    third.tweetDesc = self.tweetDesc; 
    [self.navigationController pushViewController:third animated:YES]; 

將它傳遞給任何viewcontroller只要確保它的基類是baseClassViewController。

相關問題