0

モーダル ビューにロードされた複数のビューでテーブル行の選択を共有するという終わりのない探求で、1 つの問題にたどり着きました。この魔法を再現するモデルとして Apples DrillDownSave サンプル コードを使用しています。そして、私はそれをすべてまったく同じように設定したと思います...

私の RootViewController.m の didSelectRowAtIndexPath セクションには、バイオリンメーカーの MSMutableArray を同じ名前の DetailsView MSMuteableArray にコピーする次のコードがあります。すべての色分け、およびエラーがないことは、私が正しい道を進んでいることを示しています..しかし..

detailsView.violinMakers = [violinMakers objectAtIndex:indexPath.row];

RootviewController.h ファイルで、次の方法で DetailsViewController を参照します。

@class DetailViewController

DetailsViewController *detailsView;
NSMutableArray *violinMakers; 
@property (nonatomic, retain) NSMutableArray *violinMakers;

次に、DetailsViewController .h ファイルで:

NSMutableArray *violinMakers;
IBOutlet UITextView *violinMakerDescription;
@property (nonatomic, retain) NSMutableArray *violinMakers; //tried assign or copy no difference
@property (nonatomic, retain) IBOutlet UITextView *violinMakerDescription;

そして DetailsViewController .m ファイルで:

- (void)viewWillAppear:(BOOL)animated
ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;
[violinMakerDescription setText: [violinMaker description]];
 NSLog(@"violinMakerDescription in detailsView: %@", [violinMaker description]);

上記のように、バイオリンメーカーのデータを定義するために使用する別のクラスがあります。これは didSelectRowAtIndexPath 内の rootviewcontroller で正常に機能するため、それが問題の一部ではないことはわかっています。もちろん、.m ファイルで参照します。rootViewController から DetailsViewController を直接プッシュするだけで機能することをテストしているため、すべて通常どおり IB に接続されており、データは UITextView に正常に読み込まれます。

RootviewController (tableViewColler) からプッシュされたビュー (完璧に動作) から DetailsViewController を起動しています。次の方法でモーダル ビューとして起動しています。

DetailsViewController *detailsViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil ];
UINavigationController *aDetailsViewController = [[UINavigationController alloc] initWithRootViewController:detailsViewController];

[self presentModalViewController:aDetailsViewController animated:YES];

// [violinMakerView release];
[DetailsViewController retain]; // or release no different
[aDetailsViewController release];

ビルド時にエラーは発生せず、ビューが読み込まれますが、textView の情報は空白です。これは、何もロードされておらず、適切に接続されていることも示しています...私はとても近くにいます...しかし、NSLogから、値が次のようになっていることがわかります。

violinMakerDescription in detailsView: (null)

そのため、RootviewController のバイオリンメーカーは、DetailsViewController のバイオリンメーカー配列にコピーされません。私はそれを認めたくありませんが、何週間もの間、appDelegate、NSDictionary、およびその他のあらゆる方法でこれを機能させるためにさまざまなソリューションを試しましたが、役に立ちませんでした。答えは、バイオリンメーカーがリリースされているため、何も渡さないか、RootViewController の割り当て行が機能していないと思います。私が何を変えることができるか知っている人はいますか?

不足しているものを取得していないだけですが、これは私が得た最も近いものであり、リンクを正しくする必要があるか、値が保持されていない理由を確認してください。値がいつリリースされるかを確認する方法があれば、この問題を確認できます。私はそれをどこにでも保持しようとしました(そしてそれを機能させた後に修正しました)が、機能していません...助けて??

みんな、ありがとう!!!

敬具 カーク

RootViewController の読み込み行を次のように変更しようとしました。

[detailsView.violinMakers addObject: [violinMakers objectAtIndex:indexPath.row]];

@Frankまず、これについて親切に助けてくれてありがとう!! rootViewController にバイオリンメーカー オブジェクトを同じ方法で設定すると、以下のように正常に動作します。

violinMaker = [self.violinMakers objectAtIndex:indexPath.row];

        ViolinMakerViewController *violinMakerViewController = [[ViolinMakerViewController alloc] initWithNibName:@"ViolinMakerViewController" bundle:nil];
        self.violinMakerView = violinMakerViewController;

        [[self navigationController] pushViewController:violinMakerView animated:YES];


        [self.violinMakerView.violinMakerName setText:[violinMaker name]];
    ....
        [self.violinMakerView.violinMakerDescription setText:[violinMaker description]];

        NSLog(@"violinMaker description variable in RootView: %@", [violinMaker description]);

        DetailsViewController.violinMakers = [violinMakers objectAtIndex:indexPath.row];

ここで、NSLog で問題なくロードされていることがわかります。ここで objectAtIndex:indexPath.row から配列にロードし、その配列をコピーして、DetaisViewController から ViolinMaker オブジェクトに入れるとうまくいくと思いました。DetailsViewController 内で ViolinMaker オブジェクトを再作成する必要はありませんでした。RootViewController からのように配列から再読み込みするだけです。

これは、DrillDownSave Apple の例がそれを行う方法であり、この構成をミラーリングしました。didSelectRowAtIndex の level1ViewController の次のコード

// provide the 2nd level its content
level2ViewController.listContent = [[listContent objectAtIndex:indexPath.row] objectForKey:kChildrenKey];

場所を思い出すための鍵部分は必要ありません。サンプル コードの両方のコントローラーは同じ名前の NSArray を使用しており、この行を介して L1 アレイを L2 アレイにコピーしているように見えます。

プッシュされたTableViewを使用すると簡単になりますが、IBOutletsで情報をUITextViewにロードするだけではありません。そのため、選択が行われるRootViewコントローラーで配列の割り当てを行う必要があります。RootView Controller で割り当てられた ViolinMaker を保持できれば、詳細でそれを取得できますが、それもわかりません....

私を助けてくれてありがとう、私は本当に立ち往生しています..

4

1 に答える 1

1

I think the crux of the problem is this line:

ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;

You're assigning the address of the NSMutableArray object to violinMaker. If I'm understanding correctly, violinMakers is an array of ViolinMaker objects. In that case you would want:

ViolinMaker *violinMaker = [violinMakers objectAtIndex:index];

You'll have to grab the index in the didSelectRowAtIndexPath: procedure. In fact a better way to do it might be as follows:

  1. Change your DetailsViewController to have a single violinMaker property (not an array)
  2. After you allocate your DetailsViewController, set the violinMaker property:

    detailsViewController.violinMaker = [violinMakers objectAtIndex:indexPath.row];

Then remove the cast (first code sample) and you should be mostly there.

Unfortunately Objective-C/XCode doesn't lend itself to "coding by IntelliSense" as well as VS200x/.NET does. It would probably be wise to work through a couple of tutorials and then come back to this project.

于 2009-12-16T17:37:09.900 に答える