0

「setTimeViewController」というviewControllerが1つあります。「setEventViewController」という別のビューコントローラがあります。ユーザーはsetTimeViewControllerのテーブルの行をタップし、UIPickerViewと保存ボタンのみを含むsetEventViewControllerに送信されます。ユーザーが保存ボタンをタップすると、setTimeViewControllerに戻ります。

そのピッカーでsetEventViewControllerから選択された値に、setTimeViewControllerからアクセスできるようにしたいのですが、(null)を返しています。NSString *theVariableを.hsetEventViewControllerで宣言しました。これは、他のView Controllerから取得しようとしている変数であり、そのプロパティを保持していますが、まだnullです。

setEventViewControllerのviewDidDisappearからテスト(変数NSLog)を実行して、ビューが消えるときにnullかどうかを確認しましたが、正常に機能します。

これが私のコードです。誰かが私を助けてくれるなら、私は永遠に感謝します。ありがとうございました!

setEventViewController.m

- (void)pickerView:(UIPickerView *)pickerView 
  didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

theVariable= [currentItemsInPicker objectAtIndex:row];  
//[theVariable retain]; //Tried this as well but did not work
} 

-(IBAction) Save
{
//simply dismisses the view controller back to setTimeViewController. Have also tried to   set another NSString equal to theVariable but this did not work.
[self.navigationController popViewControllerAnimated:YES];
}

setTimeViewController

 -(void) retrieveTheEvent
 {
  setEventViewController *eventViewController= [[setEventViewController alloc] init];
  NSString *testString= eventViewController.theVariable;

  NSLog (@"the event is %@", testString); //shows null
  }
4

5 に答える 5

3

私が間違っていなければ、retrieveTheEventでsetEventViewControllerの別のオブジェクトを割り当てています。この新しく割り当てられたオブジェクトは、プッシュしたものとは異なるため、この問題に直面しています。

ナビゲーションコントローラーにプッシュしたものと同じオブジェクトを使用する代わりに。

1つの解決策:setEventViewControllerでグローバルオブジェクトを作成し(つまり、そのためにiVarを作成します)、同じ参照を使用して、didSelectRowでビューコントローラーをプッシュします。また、同じiVarを使用してtheVariableにアクセスします。

setTimeViewController.hに以下のコードを追加します

setEventViewController *eventViewController;  

そのためのプロパティも作成してください。

setTimeViewController.mにあります。setEventViewControllerの既存の参照を使用して、ViewControllerをプッシュします。お気に入り

eventViewController= [[setEventViewController alloc] init];
[self.navigationController pushViewController: eventViewController animated:YES]; 

この方法を変更する
-(void)retrieveTheEvent  {   NSString *testString= eventViewController.theVariable;   NSLog (@"the event is %@", testString); //shows null   }

于 2012-07-23T06:04:37.123 に答える
1

例を挙げます。

setEventViewController.h

@protocol setEventViewControllerDelegate;

@interface setEventViewController : UIViewController 
{
    NSString* theVariable;
    id<setEventViewControllerDelegate> delegate;
}    
@end

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end

setEventViewController.m

@synthesizeデリゲート;

- (void)pickerView:(UIPickerView *)pickerView 
  didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{    
    theVariable= [currentItemsInPicker objectAtIndex:row];

    // this is where the new value is passed to setTimeViewController
    if(delegate && [delegate respondsToSelector:@selector(theVariableChanged)])
    {
        [delegate theVariableChanged:theVariable];
    }
} 

-(IBAction) Save
{
    [self.navigationController popViewControllerAnimated:YES];
}

-(void) dealloc
{
    // very important
    self.delegate = nil;
}

setTimeViewController.h

#import "setEventViewController.h"

@interface setTimeViewController : UIViewController <setEventViewControllerDelegate>
{
// your members
}
@end

setTimeViewController.m

-(void)openSetEventView
{
    setEventViewController *eventViewController= [[setEventViewController alloc] init];

    // set the delegate
    eventViewController.delegate = self;
    [self.navigationController pushViewController: eventViewController animated:YES];
    [eventViewController release];
}

// get the new value here
-(void)theVariableChanged:(NSString*)theNewValue
{
      NSLog (@"the event is %@", theNewValue);
}
于 2012-07-23T07:13:31.447 に答える
1

Armaanのリストに別のソリューションを追加します。

setEventViewController.mにデリゲートを作成し、呼び出す前に「theVariable」をsetTimeViewController.mに渡します

[self.navigationController popViewControllerAnimated:YES];
于 2012-07-23T06:11:48.057 に答える
1

シングルトンをチェックしてください、

このようなことをするとき、彼らはあなたの親友になることができます。

シングルトンのリンクはこちら

于 2012-07-25T15:29:35.387 に答える
0

顧客の初期化メソッドを含め、NSStringを1つのviewControllerから別のviewControllerに渡すためのさまざまな提案をすべて試し、プロパティをstrong、retainに変更しましたが、どちらも機能しません。

最後に、プロジェクト全体でデータを共有するシングルトンで問題が修正されました。http://www.galloway.me.uk/tutorials/singleton-classes/

ありがとう@DavidEvans

于 2020-06-08T06:45:24.663 に答える