Как программно создать UIView -> UIViewController -> UITableView - PullRequest
1 голос
/ 13 января 2011

Я пытался добавить UIView над моим UITableViewController. Посредством поиска, чтения и экспериментов я определил, что вместо UITableViewController я должен просто использовать UIViewController. Мне тяжело делать эту работу по разным причинам, и я хотел бы просто начать все сначала с лучшей архитектурой.

В основном я ищу примеры кода / учебные пособия, которые могли бы помочь мне полностью программно (без NIBS) создать следующее:

- Navigation-based Layout
- UIViewController
-- UIView
--- UITableView
--- Etc.

Причина, по которой я хочу UIView над моим UITableView, заключается в том, что я хочу иметь возможность добавлять UIView над моей таблицей.

-UPDATE-

Добавление кода, чтобы сделать это более понятным:

JMoviesListViewController.m - подкласс UITableViewController


- (void)loadView
{
    NSLog(@"loadView called");
    UIView *baseView = [[[UIView alloc] init] autorelease];
    TISwipeableTableView * aTableView = [[[TISwipeableTableView alloc] init] autorelease];   
    [aTableView setDelegate:self];
    [aTableView setDataSource:self];
    [aTableView setSwipeDelegate:self];
    [aTableView setRowHeight:54];
    [baseView addSubview:aTableView];
    self.view = baseView;
    [super loadView];
}

- (void)viewDidLoad {   

    listOfMovies = [[NSMutableArray alloc] init];

    UIView *myProgView = (UIView *)self.progView; // progView is a method that returns a UIView

    [self.view insertSubview:myProgView aboveSubview:self.tableView]; 

    [self.navigationItem setTitle:@"Now Playing"];

    movies = [[Movies alloc] init];
    movies.delegate = self;
    [movies getMovies:[NSURL URLWithString:apiQuery]];

    [super viewDidLoad];
}


- (UIView *)progView {
    if (progView == nil)
    {
        // create a progress view
        //x,y,w,h
        progView = [[UIView alloc] initWithFrame:CGRectMake(110, 110, 95, 30)];
        progView.backgroundColor = [UIColor grayColor];
        progView.tag = 1;    // tag this view for later so we can remove it from recycled table cells
        progView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin);
        progView.layer.cornerRadius = 5;


        UILabel *activityLabel = [[UILabel alloc] init];
        activityLabel.text = NSLocalizedString(@"Loading...", @"string1");
        activityLabel.backgroundColor = [UIColor grayColor];
        activityLabel.textColor = [UIColor whiteColor];
        activityLabel.font = [UIFont systemFontOfSize:14];
        [progView addSubview:activityLabel];
        activityLabel.frame = CGRectMake(5, 2, 70, 25);

        UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        [activityIndicator startAnimating];
        [progView addSubview:activityIndicator];
        activityIndicator.frame = CGRectMake(70, 5, 20, 20);


    }
    return progView;

}

Для ясности, код работает нормально, проблема в том, что строки ячеек таблицы "просачиваются" через бланковщик UIView, вставленный с этой строкой [self.view insertSubview:myProgView aboveSubview:self.tableView]; заставляет меня поверить, что myProgView не aboveSubview:self.tableView.

Ответы [ 3 ]

6 голосов
/ 13 января 2011

Представления и контроллеры - это разные вещи. Вы можете иметь иерархию контроллеров представления и иерархию представлений. Но они не чередуются, как следует из названия постов (я знаю, Interface Builder отображает их как одну иерархию, но представления и контроллеры больше похожи на две параллельные иерархии).

В любом случае, вы можете легко настроить контроллер представления на любые представления, которые вы хотите в коде. Переопределите метод loadView, создайте представление, назначенное для self.view, затем добавьте подпредставления к этому представлению.

Например:

- (void)loadView
{
    UIView *view = [[[UIView alloc] init] autorelease];
    UITableView *tableView = [[[UITableView alloc] init] autorelease];
    tableView.dataSource = self;
    tableView.delegate = self;
    [view addSubview:tableView];
    self.view = view;
}

Ваш контроллер представления должен либо наследовать UITableViewController, либо реализовывать протоколы UITableViewDataSource и UITableViewDelegate.

0 голосов
/ 27 июня 2013
- (void)viewDidLoad {   
    [super viewDidLoad];
    UIView *view = [[[UIView alloc] initwithFrame:CGRectMake(set your frame)] autorelease];
    UITableView *tableView = [[[UITableView alloc] initwithFrame:CGRectMake(set your frame)] autorelease];
    tableView.dataSource = self;
    tableView.delegate = self;
    [view addSubview:tableView];

}
if you are using **ARC** remove autorelease.
0 голосов
/ 21 июня 2013

Вы должны на самом деле указать расположение ваших разных видов, а не просто добавить их в качестве подпредставлений. Попробуйте прочитать руководство по использованию AutoLayout программно.

Вы также хотите настроить все ваши представления в loadView. Там вы можете установить нижнюю часть вашего дополнительного вида на верхнюю часть вашего вида таблицы.

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