使用动态数据的 MF Sidemenu 问题
Posted
技术标签:
【中文标题】使用动态数据的 MF Sidemenu 问题【英文标题】:MF Sidemenu problems using dynamic data 【发布时间】:2014-05-20 09:59:02 【问题描述】:我有一个问题,因为我想将动态数据放在我的侧边菜单中ץ
我正在使用 [MFSideMenu][1] 和 Xcode 5 for ios 7.0,我创建了一个 SideMenuViewController
: UITableViewController
我在我的侧边菜单中设计和填充数据。
当我启动应用程序时,它会正确显示所有数据,这些数据是我从 API 获取并存储在可变数组中的。也来自应用程序中的本地数据库。
当我使用其他用户登录时,没有关闭应用程序。我从 API 收到正确的数据,numberOfRowsInSection
显示正确的数量。
但是当应用程序访问cellForRowAtIndexPath
时,它会作用于之前填充可变数组的旧数据,而不是新数据。不知何故,它被保存了,即使我清空了可变数组,现在 SIDEMENU 仍然显示旧数据。
我尝试重新加载tableview
,但这不起作用。它重新加载表格视图,但作用于旧数据。我让它再次调用viewdidload
,但这并没有改变任何东西。使应用程序显示正确数据的唯一原因是我重新启动应用程序。
- (id)init
if (self = [super init])
self.callToServerEngine = [CallToServerEngine new];
[self getMyData];
return self;
- (void)viewDidLoad
[super viewDidLoad];
self.callToServerEngine = [CallToServerEngine new];
[DataBaseEngine new];
self.tableView.delegate = self;
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
self.allMyData = [NSMutableArray new];
[self.allMyData removeAllObjects];
所以我的问题是什么可能是错误的,是否可以在侧边菜单中使用动态数据,如果可以,实现此目的的最佳方法是什么?
编辑以获取数据
-(void)getMyData
[self.callToServerEngine getAllMyData postNotificationName:GetAllMyDataForSideMenuVC];
SideMenuViewController *weakself = self;
__block id refreshSuccess;
refreshSuccess = [[NSNotificationCenter defaultCenter] addObserverForName:GetAllMyDataForSideMenuVC
object:nil queue:nil usingBlock:^(NSNotification *note)
weakself.allMyData = [NSMutableArray new];
[weakself.allData removeAllObjects];
weakself.allMyData = [note.userInfo objectForKey:@"data"];
dispatch_async(dispatch_get_main_queue(), ^
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 4)];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationNone];
);
[[NSNotificationCenter defaultCenter] removeObserver:refreshSuccess];
refreshSuccess = nil;
];
APPDELEGATE
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]];
MFSideMenuContainerViewController *container = (MFSideMenuContainerViewController *)self.window.rootViewController;
//container.menuContainerView.translates
UINavigationController *navigationController = [storyboard instantiateViewControllerWithIdentifier:@"NavigationController"];
UITableViewController *leftSideMenuViewController = [storyboard instantiateViewControllerWithIdentifier:@"MainMenuVC"];
[container setLeftMenuViewController:leftSideMenuViewController];
[container setCenterViewController:navigationController];
container.panMode= MFSideMenuPanModeCenterViewController | MFSideMenuPanModeSideMenu;
//container.panMode = MFSideMenuPanModeCenterViewController;
self.window.rootViewController = container;
[self.window makeKeyAndVisible];
【问题讨论】:
【参考方案1】:用我的 cmets 发布一个可能的解决方案来解决这个问题。尝试在主线程上重新加载 UITableView。 UI 更新应始终在主线程上完成,否则会导致许多可解释的问题。
dispatch_async(dispatch_get_main_queue(), ^
[tableview reloadData];
);
或者您也可以重新加载显示数据的 UITableView 部分,如下所示:
dispatch_async(dispatch_get_main_queue(), ^
NSIndexSet *section = [NSIndexSet indexSetWithIndex:0];
[self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];
);
【讨论】:
对不起,作为一个菜鸟,你说的主线程是什么意思,比如我应该在 viewDidLoad 中调用这个方法,还是在我得到我的数据之后? 不用担心,您应该在获取数据后调用它。尝试替换 [weakself.tableView reloadData];带有 dispatch_async(dispatch_get_main_queue(), ^ [weakself.tableView reloadData]; ); 的代码 第一个好像没有做,第二个我一共4节。我应该遍历它们并调用 self.tableView reloadSections 四次吗? 奇怪。我认为那会奏效。对于第二部分,您不需要循环四次。只需使用您的部分索引创建一个索引集 NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)];将此传递给 reloadSections: 问题依然存在,又回到了你发布的getData函数和reloadTableview。它以正确的数量到达 numberofRows,但是当到达单元格时,它会与同一数组上的旧数据进行对话。我在侧面菜单中有另一个数据来自我的本地数据库。当这些值发生变化时,与来自 api 的值相比,它不会显示任何内容。就好像它与旧数据无关。【参考方案2】:动态值仅在我重新启动应用程序时更新,这意味着当类首次初始化时它工作。所以这就是为什么我每次按侧边菜单滑动菜单时都尝试再次调用同一个类。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]]; self.menuContainerViewController.leftMenuViewController = [storyboard instantiateViewControllerWithIdentifier:@"MainMenuVC"];
这对我有用,也许不是最好的解决方案,但它解决了我的问题。
【讨论】:
以上是关于使用动态数据的 MF Sidemenu 问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在react-navigation V5中添加动态抽屉元素?
使用 jQuery post 使用 Laravel 将动态数据传递给引导模式
StaggeredGridLayout,每行动态对象数,换行