Question

J'utilise une barre d'onglets (UITabBarController) sur mon application et je souhaite personnaliser l'apparence du tableau qui apparaît lorsque vous cliquez sur le bouton Plus. J'ai travaillé sur la façon de modifier l'apparence de la barre de navigation qui se trouve sur l'écran le plus large en définissant

self.moreNavigationController.navigationBar.barStyle

dans une sous-classe de UITabBarController et j'ai réussi à changer la couleur de fond du tableau en modifiant

self.moreNavigationController.topViewController.view.backgroundColor

, mais je ne parviens pas à changer la couleur de la police dans les cellules du tableau. J'espérais pouvoir utiliser

self.moreNavigationController.topViewController.view.visibleCells 

mais cela semble toujours être vide. J'ai essayé de le faire dans viewDidLoad, viewWillAppear et viewDidAppear sans succès. L'objet self.moreNavigationController.topViewController est de type UIMoreListController, ce qui semble être non documenté et je ne vois rien d'évident qui puisse m'aider.

Des idées?

Était-ce utile?

La solution

visibleCells est rempli uniquement après l'affichage de moreNavigationController.

Et les cellules sont créées au moment de l'exécution. Ainsi, même si vous modifiez le contenu des cellules, elles sont remplacées lorsqu'elles sont affichées.

Une chose à essayer serait de remplacer la source de données du tableView moreNavigationController, d'appeler le cellForRowAtIndexPath de la source de données d'origine et de modifier son contenu avant de le renvoyer.

À l'aide du code ci-dessous, après avoir affiché une fois le contrôleur moreNavigationController pour l'initialiser, vous verrez que lorsque vous revenez au contrôleur moreNavigationController, les cellules sont rouges mais reviennent immédiatement à un fond blanc.

UITableView *view = (UITableView *)self.tabBarController.moreNavigationController.topViewController.view;
if ([[view subviews] count]) {
  for (UITableViewCell *cell in [view visibleCells]) {
    cell.backgroundColor = [UIColor redColor];
  }
}

Autres conseils

Suite à la suggestion de Stephan de remplacer la source de données de moreNavigationController, voici un aperçu du code que j'ai mis en œuvre.

J'ai créé une nouvelle classe appelée MoreTableViewDataSource qui implémente le protocole UITableViewDataSource. Le contrôleur que plus de pages utilise réellement pour construire la table est appelé UIMoreListControllerModern, ce qui implémente uniquement les parties requises du protocole UITableViewDataSource. Ma mise en œuvre ressemble à ceci.

-(MoreTableViewDataSource *) initWithDataSource:(id<UITableViewDataSource>) dataSource
{
    self = [super init];
    if (self)
    {
            self.originalDataSource = dataSource;
    }

    return self;
}

- (void)dealloc
{
    self.originalDataSource = nil;
    [super dealloc];
}

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


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [originalDataSource tableView:tableView cellForRowAtIndexPath:indexPath];
    cell.textColor = [UIColor whiteColor];
    return cell;
}

puis dans ma classe CustomTabBarController, je remplace ViewDidLoad comme suit:

- (void)viewDidLoad {

    [super viewDidLoad];

    UINavigationController *moreController = self.moreNavigationController;
    moreController.navigationBar.barStyle = UIBarStyleBlackOpaque;

    if ([moreController.topViewController.view isKindOfClass:[UITableView class]])
    {

        UITableView *view = (UITableView *)moreController.topViewController.view;
        view.backgroundColor = [UIColor blackColor];
        moreTableViewDataSource = [[MoreTableViewDataSource alloc] initWithDataSource:view.dataSource];
        view.dataSource = moreTableViewDataSource;

    }
}

Comme demandé, voici les fichiers d'en-tête

@interface MoreTableViewDataSource : NSObject <UITableViewDataSource>
{
    id<UITableViewDataSource> originalDataSource;
}

@property (retain) id<UITableViewDataSource> originalDataSource;

-(MoreTableViewDataSource *) initWithDataSource:(id<UITableViewDataSource>) dataSource;

@end

et

#import "MoreTableViewDataSource.h"

@interface CustomTabBarController : UITabBarController 
{
    MoreTableViewDataSource *moreTableViewDataSource;
}

Merci à Inconnu . Après sa solution, je vais mettre son code dans Swift. La seule chose à faire est de créer la classe MoreTableViewCell et ce, tout simplement. Vous n'êtes pas obligé d'utiliser Storyboard. Si vous souhaitez modifier tableView, vous pouvez le faire dans la méthode personnaliserMoreTableView.

class TabBarMenuController: UITabBarController, UITableViewDelegate, UITableViewDataSource{

var tabBarItems: [UIViewController] = []
var areMessagesVisible: Bool = false

var titleForTabBars: [String] = ["resources", "events", "training", "my profile", "news", "contacts"]
var iconNames: [String] = ["film", "calendar", "classroom", "profile", "news", "Phone"]
var controllersStoryboardId: [String] = ["resourcesNavController", "eventsNavController", "enablementNavController", "profileNavController", "newsNavController", "contactsNavController"]

// to manage moreTableView
var moreTableView: UITableView = UITableView()
var currentTableViewDelegate: UITableViewDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

    self.customizeMoreTableView()
    //to REMOVE
    areMessagesVisible = true

    if !areMessagesVisible{
        self.titleForTabBars.removeAtIndex(4)
        self.controllersStoryboardId.removeAtIndex(4)
        self.iconNames.removeAtIndex(4)
    }

    for i in 0 ..< controllersStoryboardId.count{
        tabBarItems.append(UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier(controllersStoryboardId[i]) as? UINavigationController ?? UINavigationController())
    }
    self.moreNavigationController.navigationBar.tintColor = UIColor.blackColor()
}

override func viewWillAppear(animated: Bool) {

    for i in 0 ..< tabBarItems.count{
        tabBarItems[i].tabBarItem = UITabBarItem(title: titleForTabBars[i], image: UIImage(named: iconNames[i]), selectedImage: UIImage(named: iconNames[i]))
    }
    self.viewControllers = tabBarItems
}

func customizeMoreTableView(){
    moreTableView = self.moreNavigationController.topViewController!.view as? UITableView ?? UITableView()
    currentTableViewDelegate = moreTableView.delegate;
    moreTableView.delegate = self
    moreTableView.dataSource = self;
    moreTableView.registerClass(MoreTableViewCell.self, forCellReuseIdentifier: "MoreTableViewCell")

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let moreCell  = tableView.dequeueReusableCellWithIdentifier("MoreTableViewCell", forIndexPath: indexPath) as? MoreTableViewCell ?? MoreTableViewCell()

    moreCell.textLabel?.text = titleForTabBars[indexPath.row + 4]
    moreCell.imageView?.image = UIImage(named: iconNames[indexPath.row + 4])

    /*let testLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 40))
    testLabel.backgroundColor = UIColor.yellowColor()
    moreCell.addSubview(testLabel)
    */
    return moreCell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return titleForTabBars.count - 4
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    currentTableViewDelegate?.tableView!(tableView, didSelectRowAtIndexPath: indexPath)
}

 }

J'ai suivi la mise en œuvre de Ian pour personnaliser le menu Plus, mais je ne pouvais pas conserver les personnalisations après un avertissement concernant la mémoire. didReceiveMemoryWarning semble détruire le UITableView et, lorsqu'il est régénéré, il récupère son ancienne source de données. Voici ma solution:

Je remplace viewDidLoad sur le CustomTabBarController par ceci:

- (void)viewDidLoad {
    [super viewDidLoad];
    UINavigationController* moreController = self.moreNavigationController;
    if ([moreController.topViewController.view isKindOfClass:[UITableView class]]) {
        moreController.delegate = self;
        self.moreControllerClass = [moreController.topViewController class];
        UITableView* view = (UITableView*) moreController.topViewController.view;
        self.newDataSource = [[[MoreDataSource alloc] initWithDataSource:view.dataSource] autorelease];
    }
}

Comme vous pouvez le constater, j’ai ajouté quelques propriétés pour stocker les éléments dont j’avais besoin. Ceux-ci doivent être ajoutés à l'en-tête et synthétisés. J'ai également fait de CustomTabBarController un UINavigationControllerDelegate dans l'en-tête. Voici la fonction de délégué que j'ai ajoutée:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([viewController isKindOfClass:self.moreControllerClass]) {
        UIView* view = self.moreNavigationController.topViewController.view;
        if ([view isKindOfClass:[UITableView class]]) {
            UITableView* tview = (UITableView*) view;
            tview.dataSource = self.newDataSource;
            tview.rowHeight = 81.0;
        }
    }
}

Ainsi, je m'assure que ma source de données personnalisée est toujours utilisée, car je l'ai configurée de cette manière juste avant d'afficher UIMoreListController, chaque fois que celle-ci est affichée.

@interface TabBarViewController () <UITableViewDelegate,UITableViewDataSource>

@property (nonatomic,strong) UITableView* tabBarTableView;
@property (nonatomic,weak) id <UITableViewDelegate> currentTableViewDelegate;

@end

@implementation TabBarViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self costumizeMoreTableView];

}

-(void)costumizeMoreTableView{
    _tabBarTableView = (UITableView *)self.moreNavigationController.topViewController.view;
    _currentTableViewDelegate = _tabBarTableView.delegate;
    _tabBarTableView.delegate = self;
    _tabBarTableView.dataSource = self;
    [_tabBarTableView registerNib:[UINib nibWithNibName:@"MoreTabBarTableViewCell" bundle:nil] forCellReuseIdentifier:@"MoreTabBarTableViewCell"];

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 120;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    MoreTabBarTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MoreTabBarTableViewCell" forIndexPath:indexPath];
    [cell setMoreTableValues];
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{
      [_currentTableViewDelegate tableView:tableView didSelectRowAtIndexPath:indexPath];
 }

 @end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top