3

したがって、このチュートリアルiphonedevsdkを使用して、2つのビュー間でデータを渡そうとしています(最初のビューはtableViewController、セルが押されたときにデータが2番目のビューに送信され、2番目のビューがimageViewを取得し、データが送信されたときに画像が表示されます)。

ビューで同じAppDataObjectメソッドを使用しています。

- (AppDataObject*) theAppDataObject
{
    id<AppDelegateProtocol> theDelegate = (id<AppDelegateProtocol>) [UIApplication sharedApplication].delegate;
    AppDataObject* theDataObject;
    theDataObject = (AppDataObject*) theDelegate.theAppDataObject;
    return theDataObject;
}

セルが押されたとき、私はデータを送信しようとしていますtheAppDataObject.imageString = tempImageString;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    tempImageString = (((championList *) [self.champions objectAtIndex:indexPath.row]).championImage);

    AppDataObject *theDataObject = [self theAppDataObject];
    NSLog(@"tempIm-g = %@",tempImageString);
    theDataObject.imageString = tempImageString;
    NSLog(@"theAppDataObject.imageString = %@",theDataObject.imageString);

    [self.navigationController popToRootViewControllerAnimated:YES];
}

NSLog出力

tempIm-g = Champ_0.jpg

theAppDataObject.imageString =(null)

SecondViewController(画像を表示)

-(void)viewWillAppear:(BOOL)animated
{
    AppDataObject* theDataObject = [self theAppDataObject];
    UIImage *tempImage = [UIImage imageNamed:theDataObject.imageString];
    NSLog(@"temp image = %@",tempImage);
    [choosenChampionImageView setImage:tempImage];
}

NSLog出力:

一時画像=(null)

私の問題は、AppDataObject.imageStringが常にnullであるということです


私が知っている可能な解決策:

AppDataObjectを汎用データコンテナとして使用せず、appDelegateにデータを保存するだけです。

元。:

AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
appdelegate.imageString = tempImageString;

しかし、私はプロトコルの使い方を理解したいと思います。

私が試したこと:theDataObjectをグローバルにする:

view1.h

@interface championsListTableViewController : UITableViewController
{
    NSString *tempImageString;

    AppDataObject* theDataObject;
}

@property(strong,nonatomic) NSString *tempImageString;

@property(strong,nonatomic) AppDataObject* theDataObject;

NSLogの出力(@ "theDataObject is%@"、theDataObject); :

theDataObjectは(null)ですが、これはどのように可能ですか?

4

3 に答える 3

2

最初のチェックtheAppDataObject がnullかどうか。

nullの場合、次のようになります。

あなたAppDataObject* theDataObject;のインターフェースに書いて、プロパティを次のように宣言しますstrong

theDelegate.theAppDataObjectがnullを返す場合は、最初にそのオブジェクトを割り当てます。

nullでない場合は、次のようにします。

この行を変更しますtheAppDataObject.imageString = tempImageString;

theAppDataObject.imageString = [tempImageString retain];

ARCを使用している場合は、のプロパティをimageStringに設定しますstrong

またはこれで確認してください

theAppDataObject.imageString = [[NSString alloc] initWthString:tempImageString];

于 2012-09-29T11:39:25.753 に答える
1

クラスでは、プロトコルを使用する場合は、次のように使用できます。

  // this the way too declare  a protocal.
  // .h file
 @protocol TestProtocol <NSObject>

 -(void)testMyProtocolMethod:(NSString *)testvalue;

 @end

@interface TestProtocolClass: NSObject
{
   id <TestProtocol> delegate;

}
 @property (nonatomic , assign) id <TestProtocol> delegate;
 /* synthesize in the .m file   of          this      class*/
 @end



 //Now you have to use this protocol in any class where you want to use , Do like as:
 //let us suppose you want to use this protocal method in a class named "DemoProtocal".
 // .h file 
 import "TestProtocol.h"
 @interface DemoProtocal <TestProtocol>{

 }
 @end

//.m file
 #import "DemoProtocal.h"
 @implementation DemoProtocal

- (id)init{

  TestProtocol *test = [[TestProtocol alloc]init];
  test.delegate = self;

 }

-(void)testMyProtocolMethod:(NSString *)testvalue{

  // Do appropriate things.
 }
 @end
于 2012-09-29T13:26:04.197 に答える
0

「AppDelegateクラス」の変数を設定したいクラスでは、これを試すことができます。これで問題は確実に解決します。

 //Declare a variable from where you want to set the value of the "AppDelegate Class". 
 //in the yourclass.h file.
 AppDelegate/* this is the main class of the Application*/ *appDel;

//and initialize it where you want to use or you can initialize at the init of the class.  

appDel = (AppDelegate *)[[UIApplication sharedApplication]delegate];

 // Then set the value.
 appDel.imageString = tempImageString;
于 2012-09-29T11:48:15.737 に答える