2009-06-22 3 views
2

私はPHPの背景を持っていますが、私はObjective-Cを学び始めています。そのため、iPhone用のアプリケーションを開発することができます。これまでのことはかなり順調に進んでいますが、私はまだ数多くのフォーラムをグーグルやマイニングして見つけたり答えたりできなかったという疑問があります。どのようにクラスをNSStringオブジェクトからobjective-cで割り当てることができますか?

私のアプリはそれぞれ独自のタイトルバーを持つ多数のビューを作成する必要があります。これを行うためには、私のコードは、各ビューについて次のようになります。

xViewController = [ [ XViewController alloc ] init ]; 
    xNavController = [ [ UINavigationController alloc ] 
     initWithRootViewController: xViewController 
    ]; 
    xNavController.tabBarItem = [ [ UITabBarItem alloc ] 
     initWithTitle: @"My Info" 
     image: [ UIImage imageNamed: @"my_info.png" ] 
     tag: 3 
    ]; 

これは動作しますが、私は何をしたいこととして文字列を送信したときにナビゲーションコントローラを返却するメソッドを作成することですメッセージですから、私は各ビューごとにこれをすべて行う必要はありません。私が抱えている問題は、最初の行は文字列として渡されたクラス名に基づいてオブジェクトを割り当てる必要があるということです(つまり、メソッドに渡された文字列からXViewControllerを取得する必要があります)。文字列をクラス名として扱います。 UIApplicationMain()が文字列を使用してアプリケーションデリゲートクラスを呼び出すことができるため、可能性があります。どうしたらいいですか?

これが意味をなさない場合は申し訳ありませんが、私はまだ新しい言語を学ぶ初期段階にあります。

+0

あなたはこれを行うことができます(下の回答で示されます)が、これがあなたのコードをどのように小さくするか、簡単にするか、エラーを起こしにくくするかはっきりしていませんか? –

+0

文字列をパラメータとして渡す必要があるのはなぜですか?なぜクラスとしてパラメータを渡すことができないのですか? –

+0

Stephen、私が作成した各ビューに対して上記のコードを繰り返す必要がないので、あなたが尋ねるすべてのことを行います。コードの1行で毎回正しい方法を呼び出すことができます。 クリス、クラスをパラメータとして単純に渡すことはできませんでしたが、正直言ってクラスを渡すことはできませんでした。クラス名の文字列、 'initWithTitle'メソッド、およびイメージ名 – JoBu1324

答えて

19

と同様にランタイムを使用して、あなただけのココアタッチメソッドを使用してそれを行うことができます:私はあなたの問題を理解していれば

NSString* theClassName = /* assume this exists */ 
Class theClass = NSClassFromString(theClassName); 
NSObject* myObject = [[theClass performSelector:@selector(alloc)] init]; 
// do something with the new object instance 
+0

私が探しているもの。ありがとうジェイソン! – JoBu1324

+17

performSelector:は必要ありませんが、[[theClass alloc] init]と書くことができます。 –

-1

は正しくあなたが作るために、動的クラスは必要ありません。この作品。各ビューコントローラクラスに対して、そのビューコントローラの一意のタイトルとイメージを返すユニークなtitleimageメソッドを作成しないでください。次に、ダミーのtitleimageのメソッドを持つビューコントローラクラスのスーパークラスを作成します。

- (UINavigationController *)getNavController:(XGenericViewController *)viewController 
{ 
     UINavigationController *xNavController = [ [ UINavigationController alloc ] 
      initWithRootViewController: viewController 
     ]; 
     xNavController.tabBarItem = [ [ UITabBarItem alloc ] 
      initWithTitle: [viewController title] 
      image: [viewController image] 
      tag: 3 
     ]; 

    return [xNavController autorelease]; 
} 
1

あなたはニブからロードされた複数のTableViewCellsを持っている場合は、動的ロードで何かをしない場合は、個々のニブをロードするためのコードは醜い取得します:上記

あなたのコードは、このようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // header 
    if (indexPath.row == 0) { 
     cellHeader *cell = (cellHeader *)[self loadCell:identHeader]; 
     return cell; 

    // load more 
    } else if (indexPath.row == lastRow) { 
     loadMore *cell = (loadMore *)[self loadCell:identLoadMore]; 
     return cell; 
    } 

    // default 
    cellDefault *cell = (cellDefault *)[self loadCell:identDefault]; 
    return cell; 
} 

- (id)loadCell:(NSString *)className { 
    id cell = [tweetsView dequeueReusableCellWithIdentifier:className]; 

    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:className owner:nil options:nil]; 

     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = currentObject; 
       break; 
      } 
     } 
    } 

    return cell; 
}