Frage

Ich bin mit einer Tab-Leiste (UITabBarController) auf meinem app und ich wünsche das Aussehen der Tabelle anpassen, die angezeigt wird, wenn Sie auf die Schaltfläche Mehr klicken. Ich habe gearbeitet, wie das Aussehen der Navigationsleiste ändern, indem Sie auf dem Bildschirm mehr ist

self.moreNavigationController.navigationBar.barStyle

in einer Unterklasse von UITabBarController und ich habe es geschaffen, durch Änderung der Hintergrundfarbe der Tabelle zu ändern

self.moreNavigationController.topViewController.view.backgroundColor

, aber ich kann nicht herausfinden, wie die Schriftfarbe in den Zellen zu ändern, die auf dem Tisch erscheinen. Ich hatte gehofft, ich könnte verwenden

self.moreNavigationController.topViewController.view.visibleCells 

aber dies scheint immer leer zu sein. Ich habe versucht, dies zu tun in viewDidLoad, viewWillAppear und viewDidAppear ohne Erfolg. Das Objekt self.moreNavigationController.topViewController ist vom Typ UIMoreListController, die ohne Papiere zu sein scheint, und ich kann nichts offensichtlich in der Schnittstelle sehen, die mir helfen wird.

Irgendwelche Ideen?

War es hilfreich?

Lösung

visibleCells wird nur gefüllt, nachdem der moreNavigationController angezeigt wird.

Und die Zellen werden zur Laufzeit erstellt, so dass selbst wenn Sie den Inhalt der Zellen ändern, sie ersetzt werden, wenn sie angezeigt werden.

Eine Sache, um zu versuchen, die Datenquelle des moreNavigationController Tableview zu ersetzen wäre, die cellForRowAtIndexPath der ursprünglichen Datenquelle aufrufen und ihren Inhalt zu ändern, bevor es zurück.

Sie den Code unten verwenden, nachdem angezeigt zu haben, sobald die moreNavigationController es zu initialisieren, werden Sie sehen, dass, wenn Sie auf die moreNavigationController zurückkehren, sind die Zellen rot, aber sofort wieder auf weißen Hintergrund.

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

Andere Tipps

Vorschlag Im Anschluss an Stephan der Datenquelle des moreNavigationController zu ersetzen, hier ist eine schnelle Übersicht des Codes I umgesetzt werden.

Ich habe eine neue Klasse namens MoreTableViewDataSource, die das UITableViewDataSource Protokoll implementiert. Die Steuerung, die die weitere Seite verwendet tatsächlich die Tabelle zu bauen ist die UIMoreListControllerModern genannt, und dies führt nur die benötigten Teile des UITableViewDataSource Protokolls. Meine Implementierung sieht wie folgt aus.

-(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;
}

und dann in meiner CustomTabBarController Klasse I außer Kraft setzen viewDidLoad wie folgt:

- (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;

    }
}

Wie hier angefordert sind die Header-Dateien

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

@property (retain) id<UITableViewDataSource> originalDataSource;

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

@end

und

#import "MoreTableViewDataSource.h"

@interface CustomTabBarController : UITabBarController 
{
    MoreTableViewDataSource *moreTableViewDataSource;
}

Dank Unbekannt . Nach seiner Lösung, werde ich seinen Code in Swift setzen. Nur das, was Sie sollten mehr tun, ist MoreTableViewCell Klasse erstellen und es einfach. Sie müssen nicht verwenden Storyboard. Wenn Sie Tableview ändern möchten, können Sie es in customizeMoreTableView Methode tun.

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)
}

 }

Ich folgte Ians Umsetzung das Mehr-Menü anpassen, aber ich war ein Problem mit den Anpassungen nach einer Speicher Warnung zu halten. didReceiveMemoryWarning scheint die UITableView zu zerstören, und wenn es regeneriert wird es erhält seine alte Datasource zurück. Hier ist meine Lösung:

Ich ersetze viewDidLoad auf dem CustomTabBarController mit diesem:

- (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];
    }
}

Wie Sie sehen können, habe ich ein paar Eigenschaften zum Speichern von Sachen, die ich brauchte. Die haben in den Header und synthetisiert hinzugefügt werden. Ich auch CustomTabBarController ein UINavigationControllerDelegate im Header gemacht. Hier ist die Delegatfunktion ich hinzugefügt:

- (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;
        }
    }
}

So kann ich meine benutzerdefinierte Datenquelle stellen Sie sicher, immer verwendet wird, weil ich es so eingestellt kurz vor der UIMoreListController zeigt, ist jedes Mal gezeigt werden.

@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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top