Как поместить UITableView в UIView

Я пытаюсь поместить UITableView в UIView. UIView также будет содержать некоторые другие вещи, поэтому я хочу захотеть определить часть UIView, которая будет использоваться UITableView. Чтение на этом и других сайтах, я использую «UIViewController» и делегаты ».

Мои вопросы:

  • Почему я не вижу UITable с кодом ниже?

  • Почему я вижу UITable при изменении в InformatieSectieViewController.h

    @interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 

    в

     @interface InformatieSectieViewController : UIViewTableController <UITableViewDataSource, UITableViewDelegate> 

    (UIViewController to UI Table ViewController)? (Этот UITable затем обрабатывает весь UIView).

  • Как получить UITableView правильно в UIView.

  • Что меня удивляет; когда я удаляю часть <UITableViewDataSource, UITableViewDelegate> из @interface InformatieSectieViewController: UIViewController <UITableViewDataSource, UITableViewDelegate>, я ожидал бы предупреждения по строкам (в InformatieSectieViewController.m):

     tabView.delegate = self; tabView.dataSource = self; 

    Но я не понимаю этого предупреждения.

Вот код, который я использую:

InformatieSectie.h

 #import <UIKit/UIKit.h> @interface InformatieSectie : NSObject @property (strong, nonatomic) NSString *header; -(UIView*)createInformatieSectie; @end 

InformatieSectie.m

 #import "InformatieSectie.h" #import "InformatieSectieViewController.h" #import <QuartzCore/QuartzCore.h> @implementation InformatieSectie @synthesize header; @synthesize footer; -(UIView*)createInformatieSectie{ UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 200, breedte, hoogte)]; //(add headerlabel at pos) [view addSubview:headerLabel]; InformatieSectieViewController *svc = [[InformatieSectieViewController alloc] init]; [view addSubview:svc.view]; return view; } @end 

И это второй класс, где я определяю UITableView:

InformatieSectieViewController.h

 #import <Foundation/Foundation.h> @interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @property (nonatomic, retain) UITableView *tabView; @end 

InformatieSectieViewController.m

 #import "InformatieSectieViewController.h" #import <QuartzCore/QuartzCore.h> @implementation InformatieSectieViewController @synthesize tabView; -(void)loadView { tabView = [[UITableView alloc] initWithFrame:CGRectMake(100, 100, 20, 20)]; tabView.delegate = self; tabView.dataSource = self; tabView.layer.borderWidth = 10.0; tabView.layer.borderColor = [UIColor yellowColor].CGColor; self.view = tabView; self.view.layer.backgroundColor = [UIColor magentaColor].CGColor; [super loadView]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // (return some cell) } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // (Nothing yet) } @end 

2 Solutions collect form web for “Как поместить UITableView в UIView”

Несколько замечаний:

  1. Ты спрашивал:

    Когда я <UITableViewDataSource, UITableViewDelegate> часть <UITableViewDataSource, UITableViewDelegate> из

      @interface InformatieSectieViewController : UIViewController < UITableViewDataSource, UITableViewDelegate> 

    Я ожидал бы предупреждения по строкам (в InformatieSectieViewController.m):

      tabView.delegate = self; tabView.dataSource = self; 

    Но я не понимаю этого предупреждения.

    Да, это любопытно. Если вы используете UIViewController , вы действительно должны увидеть эти предупреждения. Если у вас есть другие предупреждения, иногда вы не увидите никаких последующих предупреждений. Или иногда, если вы редактируете заголовок, не сохраняйте и / или не создавайте, вы можете не видеть предупреждение до тех пор, пока не сделаете это. Или попробуйте выбрать «Очистить» в меню «Построить», а затем перестроить и посмотреть, получилось ли предупреждение.

    Независимо от того, даже если вы не видите эти предупреждения, вы все равно должны определить его для соответствия этим двум протоколам, так как это упростит ваш код в Xcode.

    Однако если вы используете UITableViewController в качестве базового класса, вам не нужно определять его как соответствующий этим двум протоколам, поскольку он уже соответствует UITableViewDataSource и UITableViewDelegate .

  2. Как добавить tableview в качестве подзадачи

    И в ответ на более широкий вопрос о том, как добавить представление таблицы в представление с другими материалами на нем, а не делать следующее в loadView :

     self.view = tabview; 

    Вместо этого вы должны сделать следующее в loadView :

     self.view = [[UIView alloc] init]; [self.view addSubview:tabview]; 

    Или если вы не loadView представление программно в loadView , а используете NIB или раскадровку, вы можете просто сделать следующее в viewDidLoad :

     [self.view addSubview:tabview]; 

    Независимо от того, что у вас есть другой основной UIView , и ваш UITableView является подвью, вы можете добавить другие элементы управления к этому основному виду.

  3. Просмотр и просмотр иерархий контроллера

    Взглянув дальше на ваш образец кода, я вижу, что вы создаете контроллер, захватываете его представление, добавляете это представление в качестве подвью, а затем позволяете контроллеру выйти из сферы действия. Это очень плохая практика. Если ARC, вы получите исключения. Если не-ARC, вы будете утечка, если вы когда-нибудь отклоните это представление (но не проблема, если это ваш вид верхнего уровня).

    Хуже того, если вы это сделаете, ваш контроллер просмотра не получит определенных событий (в частности, событий ротации, но, возможно, других). См. WWDC 2011 – Внедрение UIViewController Containment для обсуждения важности синхронизации вашего представления и просмотра иерархии контроллеров.

    Если это ваш контроллер верхнего уровня, вы должны установить этот контроллер как rootViewController , например, в делегат приложения:

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. // create your controller any way you want self.viewController = [[InformatieSectieViewController alloc] init]; // if not using ARC, it should be // // self.viewController = [[[InformatieSectieViewController alloc] init] autorelease]; // by defining this as your root view controller, you'll be assured that the controller // is now part of the controller hierarchy self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } 

    Если этот контроллер представления не является контроллером верхнего уровня, вы должны создать его в контроллере представления и либо сделать модальный, либо нажать сеге из контроллера представления, например:

     - (void)transitionToNextViewController { UIViewController *controller = [[InformatieSectieViewController alloc] init]; // again, if not using ARC, that line should be: // // UIViewController *controller = [[[InformatieSectieViewController alloc] init] autorelease]; [self presentViewController:controller animated:YES completion:nil]; // or // [self.navigationController pushViewController:controller animated:YES]; } 

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

     - (void)addChild { UIViewController *controller = [[InformatieSectieViewController alloc] init]; // again, if not using ARC, that line should be: // // UIViewController *controller = [[[InformatieSectieViewController alloc] init] autorelease]; [self addChildViewController:controller]; controller.view.frame = CGRectMake(x, y, width, height); [self.view addSubview:controller.view]; [controller didMoveToParentViewController:self]; } 

    Любой из этих трех методов обеспечит синхронизацию иерархии диспетчера вашего представления с вашей иерархией представлений. Я знаю, что это похоже на то, что это слишком много, но позже вы столкнетесь с проблемами, если не справитесь с этим одним из этих трех способов.

Я знаю, что здесь много, но я надеюсь, что это поможет. Прошу прощения, если это сбивает с толку.

Вы должны сделать [self.view addSubview:self.tabView] вместо self.view = self.tabView

  • UIReferenceLibraryViewController в popover
  • UIGestureRecognizer блокирует subview для обработки событий касания
  • UIView, созданный в IB, не имеет фрейма в viewDidLoad и awakeFromNib
  • Приложение для iPhone OS Utility - просмотр с обратным видом и основным видом
  • iOS - viewForFooterInSection, прикрепляющийся к нижней части UITableView
  • UIView.addSubview с использованием загруженного NIB-представления добавляет только root UIView
  • iOS Custom UIView Drawing - CAShapeLayers или drawRect?
  • Сбой в actionForLayer: forKey:
  • Добавление нового представления Viewcontroller в качестве подзадачи
  • Использование CollectionView в UIView с xib-файлом
  • Неправильные границы UIView / рисунок в симуляторе
  • Interesting Posts

    Альтернатива анимации (forKey :) (теперь устарела)?

    Создание макетов одеяла в UICollectionView

    Уведомления IOS с FCM

    Можно ли заставить клавиатуру iOS погладить английскую клавиатуру?

    Не получать уведомления PushKit для пользовательской зоны записи на Mac

    Найдены множественные кодовые имена (например, пары сертификатов и частных ключей)

    Функция возврата открыта, закрыта или закрыта с часов

    Как связать библиотеку Xamarin iOS Obj-C с сортировкой

    Кнопка Click Click UICollectionViewCell Ширина и изменение высоты

    Как использовать distinctUnionOfObjects в Realm swift

    Ionic 2, используя Angular 2 Pipe breaks на iOS- «Невозможно найти переменную: Intl»

    Как установить selectedindex для контроллера просмотра UITabBarController больше в iOS

    Как сделать индивидуальную клавиатуру отстыковкой?

    Xcode Unit Tests – Ошибка связи при создании только для устройства

    Что случилось с этим dealloc в ARC?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.