1

SplitViewController ビューを作成しようとしていますが、次の警告が表示されます。

プロパティ splitViewController には、メソッド setSplitViewController を定義する必要があります - @Synthesize、@dynamic を使用するか、このクラスの実装でメソッドの実装を提供します。

ここにコードがあります

///AppDelegate.h

 @class ViewController;
 @class DetailViewController;

 @interface AppDelegate : UIResponder <UIApplicationDelegate, UISplitViewControllerDelegate>
{
UISplitViewController *splitViewController;
ViewController *viewcontroller;
DetailViewController *detailViewController;
}
@property (nonatomic,retain) UIWindow *window;
@property (nonatomic,retain) DetailViewController *detailViewController;
@property(nonatomic,retain)  UISplitViewController *splitViewController;
@property (nonatomic,retain) ViewController *viewController;

@end

///AppDelegate.m"

#import "ViewController.h"
#import "DetailViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
 @synthesize splitviewController;
 @synthesize detailViewController;
- (void)dealloc
{
   [_window release];
   [_viewController release];
   [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   ViewController *rootViewController = [[ViewController alloc]   initWithStyle:UITableViewStylePlain];
   UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
   detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
   rootViewController.detailViewController = detailViewController;    

   splitViewController = [[UISplitViewController alloc] init];
   splitViewController.viewControllers = [NSArray arrayWithObjects:navigationController, detailViewController, nil];
   splitViewController.delegate = detailViewController;

   [self.window makeKeyAndVisible];
   return YES;
}




///ViewController.h
 #import <UIKit/UIKit.h>
 @class DetailViewController;
 @interface ViewController : UITableViewController{
 DetailViewController *detailViewController;
 NSMutableArray *phone;
 }
@property (nonatomic,retain)IBOutlet DetailViewController *detailViewController;
@property (nonatomic,retain) NSMutableArray *phone;
@end



///ViewController.m
#import "ViewController.h"
#import "DetailViewController.h"

@interface ViewController ()

@end

 @implementation ViewController
 @synthesize detailViewController,phone;

  - (CGSize)contentSizeForViewInPopoverView {
 return CGSizeMake(320, 600);
 }


- (void)viewDidLoad
{
  [super viewDidLoad];
  self.phone = [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"phone" ofType:@"plist"]] retain];

// Do any additional setup after loading the view, typically from a nib.
  }

  - (void)viewDidUnload
{
 [super viewDidUnload];
// Release any retained subviews of the main view.
 }

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
 return YES;
 }
- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView {
  // Return the number of sections.
 return 1;
 }


 - (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [phone count];
 }


  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *CellIdentifier = @"CellIdentifier";

// Dequeue or create a cell of the appropriate type.
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryNone;
 }

// Configure the cell.
 cell.textLabel.text = [self.phone objectAtIndex:indexPath.row];
 return cell;
 }
  - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

  /*
   When a row is selected, set the detail view controller's detail item to the item associated with the selected row.
   */
 detailViewController.detailItem = [self.phone objectAtIndex:indexPath.row];
 }
 - (void)dealloc {
 [detailViewController release];
 [super dealloc];
 }



  @end
4

3 に答える 3

1

問題は、@synthesize ステートメントで splitViewController のスペルを間違えていることです。v を大文字にしませんでした。

簡単な方法で実行した場合、この問題に遭遇することはありません。インスタンス変数も @synthesize ステートメントも必要なくなりました。プロパティを作成すると、両方が自動的に取得されます。

于 2013-02-11T07:45:59.640 に答える
1

あなたのコードでは、splitViewControllerプロパティを合成していません。プロパティを合成していないため、コンパイラは警告を発行して、プロパティを合成して、便利なようにセッターとゲッターを自動的に生成できるようにします (生成されたセッターとゲッターは、.表記法を使用しself.splitViewControllerて合成することができます)なので @synthesize splitViewController = _splitViewController

また

独自のカスタム セッターとゲッターを次のように実装します。

//setter
- (void)setSplitViewController:(UISplitViewController*)splitViewController_ {
    //assuming your property has retain identifier
    if (splitViewController != splitViewController_) {
        [splitViewController release];
        splitViewController = [splitViewController_ retain];
    }
}

//getter
- (UISplitViewController*)splitViewController {
    return splitViewController;
}

また

を使用してプロパティを動的として宣言します@dynamic splitViewController。これは、プロパティのセッターとゲッターが別の場所から提供されることを意味します。

編集:

didFinishLaunchingWithOptionsappDelegate.m のメソッドを次のように置き換えます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   _viewController = [[ViewController alloc] initWithNibName:@"ViewController's nib name" bundle:nil];
   UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:_viewController];
   detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
   rootViewController.detailViewController = detailViewController;    

   splitViewController = [[UISplitViewController alloc] init];
   splitViewController.viewControllers = [NSArray arrayWithObjects:navigationController, detailViewController, nil];
   splitViewController.delegate = detailViewController;

   self.window.rootViewController = splitViewController;
   return YES;
}

また、dealloc を編集します。

- (void)dealloc
{
   [_window release];
   [_viewController release];
   [splitViewController release];
   [detailViewController release];
   [super dealloc];
}

そしてviewControllerでviewDidLoadself.phones行をこれに置き換えます

self.phone = [[NSArray arrayWithObjects:@"セル 1",@"セル 2",@"セル 3",@"セル 4",@"セル 5",@"セル 6", nil];

これは、配列部分が適切にロードされていることをテストするためのものです。セルが作成されているかどうかを確認できるようにするためです。メソッドにブレークポイントを置き、cellForRowAtIndexPathそれが呼び出されるかどうかを確認します

そして最後にdidSelect、detailItem iVar が nil でないかどうかを確認します。

はい、ロードする前にNIB名を適切に確認し、NIBのすべてのアウトレットが適切に接続されていることも確認してください。

乾杯して楽しんでください。

于 2013-02-11T07:13:21.723 に答える
0

あなたの場合、追加@synthesize splitViewController = _splitViewController; して detailViewController = _ detailViewController;

これは便利なコードです。どうすれば追加できますかUISplitViewController

/// AppDelegate.h file

#import <UIKit/UIKit.h>
#import "MasterViewController.h"
#import "DetailViewController.h"


@interface AppDelegate : UIResponder <UIApplicationDelegate, UISplitViewControllerDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, strong)  UISplitViewController *splitViewController;
@property (nonatomic, strong)  MasterViewController *masterVC;
@property (nonatomic, strong)  DetailViewController *detailVC;

@property (nonatomic, strong)  UINavigationController *mvcNavCon;
@property (nonatomic, strong)  UINavigationController *dvcNavCon;

@end


/// AppDelegate.m File

#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    self.masterVC = [[MasterViewController alloc] init];
    self.mvcNavCon = [[UINavigationController alloc] initWithRootViewController:self.masterVC];

    self.detailVC = [[DetailViewController alloc] init];
    self.dvcNavCon = [[UINavigationController alloc] initWithRootViewController:self.detailVC];

    self.splitViewController = [[UISplitViewController alloc] init];
    self.splitViewController.delegate = self;
    self.splitViewController.viewControllers = [NSArray arrayWithObjects:self.mvcNavCon, self.dvcNavCon,nil];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = self.splitViewController;

    [self.window makeKeyAndVisible];
    return YES;
}
于 2013-02-11T06:54:13.227 に答える