@interface и несколько имен классов Objective-c - PullRequest
1 голос
/ 29 февраля 2012

Оригинальный вопрос

У меня есть класс с именем RootViewController, и мой .h файл имеет код ниже

#import "SEViewController.h"


@interface RootViewController : SEViewController{

}
@end

и мой SEViewController выглядит как

@interface SEViewController : UIViewController
{
}

@end

Как я могу объявить RootViewController как UITableViewController, а также как SEViewController одновременно?


Отредактированный вопрос

Теперь у меня есть код ниже, но я получаю предупреждения, и табличное представление не появляется.

RootViewController.m:

#import <UIKit/UIKit.h>
#import "ApplicationCell.h"
#import "SEViewController.h"


@interface RootViewController : SEViewController <UITableViewDataSource, UITableViewDelegate>
{
    UITableView *tableView;
    ApplicationCell *tmpCell;
    NSArray *data;
}
@property (copy) NSArray *data;
@property(nonatomic,retain)UITableView *tableView;

@end

RootViewController.m:

#import "RootViewController.h"
#import "SubviewApplicationCell.h"


#define DARK_BACKGROUND  [UIColor viewFlipsideBackgroundColor]
#define LIGHT_BACKGROUND [UIColor clearColor];


@implementation RootViewController
@synthesize data;
@synthesize tableView = _tableView;
#pragma mark -
#pragma mark View controller methods


- (void)viewDidLoad
{
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"rules" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
    self.navigationItem.title = @"rules";
    self.navigationController.navigationBar.tintColor = [UIColor blackColor];
    self.tableView = [[UITableView alloc]init];
    self.tableView.rowHeight = 73.0;
    self.tableView.backgroundColor = DARK_BACKGROUND;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    [super viewDidLoad];


}

- (void)viewDidUnload
{
    self.data = nil;
    [super viewDidLoad];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return YES;
}


#pragma mark -
#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ApplicationCell";

    ApplicationCell *cell = (ApplicationCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {

        cell = [[[SubviewApplicationCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                            reuseIdentifier:CellIdentifier] autorelease];

    }



    cell.arrow = [UIImage imageNamed:@"circle"];
    cell.name = [data objectAtIndex:indexPath.row];

    return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{

    cell.backgroundColor =  LIGHT_BACKGROUND;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   // [self.navigationController pushViewController:nil animated:YES];
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}


#pragma mark -
#pragma mark Memory management

- (void)dealloc
{
    [data release];
    [super dealloc];
}

@end

Ответы [ 4 ]

3 голосов
/ 29 февраля 2012

Почему бы вам не сделать

@interface SEViewController : UITableViewController
{

}

Или создать SEViewController как UIViewController, поместить в него таблицу и реализовать UITableViewDelegate, и вы получите то же самое.

@interface SEViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{

}

Для создания и добавления таблицы к вашему виду используйте этот код:

    - (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect totalFrame = self.view.frame;
    UITableView *myTableView = [[UITableView alloc] initWithFrame:totalFrame style:UITableViewStylePlain];
    [self.view addSubview:myTableView];
    [myTableView release];

}
3 голосов
/ 29 февраля 2012

Цель C не поддерживает множественное наследование. Таким образом, RootViewController не может быть подклассом SEViewController и UITableViewController.

Однако вы можете заставить RootViewController соответствовать протоколам: UITableViewDelegate и UITableViewDataSource и реализовать соответствующие методы.

@interface RootViewController : SEViewController < UITableViewDelegate, UITableViewDataSource>

// tableView declaration;
@property (strong, nonatomic) UITableView *tableView;

// ...
@end

@implementation RootViewController

@synthesize tableView = _tableView;

// ...
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     // ...
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
     // ...
}
// ...

Редактировать После того, как вы показали свой полный код, я думаю, что проблема здесь:

@interface RootViewController : SEViewController <UITableViewDataSource, UITableViewDelegate>
{
    UITableView *tableView; // Remove this line
    ApplicationCell *tmpCell;
    NSArray *data;
}
1 голос
/ 29 февраля 2012

Вы можете наследовать только от одного родительского класса, но похоже, что вы просто хотите сделать ...

@interface RootViewController : SEViewController <UITableViewDataSource, UITableViewDelegate> {
1 голос
/ 29 февраля 2012

Множественное наследование невозможно в target-c, все, что вы можете сделать, это включить табличное представление в SEViewController и объявить в нем методы делегата .. надеясь, что это поможет ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...