通过点击 UIButton 重新加载 UIScrollView
Posted
技术标签:
【中文标题】通过点击 UIButton 重新加载 UIScrollView【英文标题】:Reload UIScrollView by tapping a UIButton 【发布时间】:2014-12-10 05:36:02 【问题描述】:让我先解释一下我的项目。我的SQLIte
DB 表中有一些名为“note”的数据。
在“注释”表中,我有这些字段:id
、noteToken
、note
。
我在这里所做的是从该表中将所有note
加载到NSMUtableArray
中。并根据array
内容编号创建UIButton
,并将这些按钮添加到UIScrollView
中作为subView
。 scrollview
的按钮数和宽度会根据该数组的内容数自动生成。现在,当有人点击其中一个按钮时,它会将他带到下一个viewController
并向他显示该viewController
中的相应注释详细信息。
我对另一个NSMUtableArray
做同样的事情,但这次它从“note”表中读取了所有id
。它同样在同一个UIScrollView
中生成新的删除按钮。但是,如果有人点击这些删除按钮,它将从SQLIte
DB 的“注释”表中删除该特定注释。 并重新加载UIScrollView
。除了 RELOAD THE UIScrollView
部分之外,所有操作都已完成。这就是我要的。我尝试了所有现有的解决方案,但不知道为什么它不起作用。
这是我的代码:
- (void)viewDidLoad
[super viewDidLoad];
self.noteToken = [NSString stringWithFormat:@"%@%@", fairId, exibitorId];
scrollViewNoteWidth = 100;
[scrollViewNote setScrollEnabled:YES];
[scrollViewNote setContentSize:CGSizeMake((noteButtonWidth * countNoteButtonArray) + scrollViewNoteWidth, 100)];
sqLite = [[SQLite alloc] init];
[self.sqLite callDataBaseAndNoteTableMethods];
self.noteButtonArrayy = [[NSMutableArray alloc] init];
noteButtonArrayy = [self.sqLite returnDataFromNoteTable:noteToken];
[self LoadNoteButtonAndDeleteButton:noteButtonArrayy];
//////////////*----------------------- Note Section (Down) -----------------------*//////////////
-(void) LoadNoteButtonAndDeleteButton:(NSMutableArray *) noteButtonArray
sQLiteClass = [[SQLiteClass alloc] init];
noteButtonArrayToShowNoteButton = [[NSMutableArray alloc] init];
/*--------------- Load the noteButton & pass note (Down)---------------*/
for (int i = 0; i < [noteButtonArray count]; i++)
sQLiteClass = [noteButtonArray objectAtIndex:i];
// NSString *ids = [NSString stringWithFormat:@"%d", sQLiteClass.idNum];
NSString *nt = sQLiteClass.note;
[noteButtonArrayToShowNoteButton addObject:nt];
[self ShowNoteButtonMethod:noteButtonArrayToShowNoteButton];
/*--------------- Load the noteButton & pass note (Up)---------------*/
/*--------------- Load the deleteButton & pass id (Down)---------------*/
noteButtonArrayToDeleteNoteButton = [[NSMutableArray alloc] init];
for (int i = 0; i < [noteButtonArray count]; i++)
sQLiteClass = [noteButtonArray objectAtIndex:i];
// Convert int into NSString
NSString *ids = [NSString stringWithFormat:@"%d", sQLiteClass.idNum];
[noteButtonArrayToDeleteNoteButton addObject:ids];
[self ShowNoteDeleteButtonMethod:noteButtonArrayToDeleteNoteButton];
/*--------------- Load the deleteButton & pass id (Down)---------------*/
-(void) ShowNoteButtonMethod:(NSMutableArray *) btnarray
countNoteButtonArray = [btnarray count];
// For note button
noteButtonWidth = 60;
noteButtonXposition = 8;
for (NSString *urls in btnarray)
noteButtonXposition = [self addNoteButton:noteButtonXposition AndURL:urls];
-(int) addNoteButton:(int) xposition AndURL:(NSString *) urls
noteButton =[ButtonClass buttonWithType:UIButtonTypeCustom];
noteButton.frame = CGRectMake(noteButtonXposition, 8.0, noteButtonWidth, 60.0);
[noteButton setImage:[UIImage imageNamed:@"note.png"] forState:UIControlStateNormal];
[noteButton addTarget:self action:@selector(tapOnNoteButton:) forControlEvents:UIControlEventTouchUpInside];
[noteButton setUrl:urls];
noteButton.backgroundColor = [UIColor clearColor];
[self.scrollViewNote addSubview:noteButton];
noteButtonXposition = noteButtonXposition + noteButtonWidth + 18;
return noteButtonXposition;
-(void)tapOnNoteButton:(ButtonClass*)sender
urlNote = sender.url;
[self performSegueWithIdentifier:@"goToNoteDetailsViewController" sender:urlNote];
-(void) ShowNoteDeleteButtonMethod:(NSMutableArray *) btnarray
countNoteButtonArray = [btnarray count];
// For delete button
deleteNoteButtonWidth = 14;
deleteNoteButtonXposition = 31;
for (NSString *idNumber in btnarray)
deleteNoteButtonXposition = [self addDeleteButton:deleteNoteButtonXposition AndURL:idNumber];
-(int) addDeleteButton:(int) xposition AndURL:(NSString *) idNumber
deleteNoteButton =[ButtonClass buttonWithType:UIButtonTypeCustom];
deleteNoteButton.frame = CGRectMake(deleteNoteButtonXposition, 74.0, deleteNoteButtonWidth, 20.0);
[deleteNoteButton setImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal];
[deleteNoteButton addTarget:self action:@selector(tapOnDeleteButton:) forControlEvents:UIControlEventTouchUpInside];
[deleteNoteButton setIdNum:idNumber];
deleteNoteButton.backgroundColor = [UIColor clearColor];
[self.scrollViewNote addSubview:deleteNoteButton];
deleteNoteButtonXposition = deleteNoteButtonXposition + deleteNoteButtonWidth + 65;
return deleteNoteButtonXposition;
-(void)tapOnDeleteButton:(ButtonClass*)sender
idNumb = sender.idNum;
[self.sqLite deleteData:[NSString stringWithFormat:@"DELETE FROM note WHERE id IS '%@'", idNumb]];
// NSLog(@"idNumb %@", idNumb);
//[self.view setNeedsDisplay];
//[self.view setNeedsLayout];
//[self LoadNoteButtonAndDeleteButton];
//[self viewDidLoad];
// if ([self isViewLoaded])
//
// //self.view = Nil;
// //[self viewDidLoad];
// [self LoadNoteButtonAndDeleteButton];
//
//////////////*----------------------- Note Section (Up) -----------------------*//////////////
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"goToNoteDetailsViewController"])
NoteDetailsViewController *noteDetailsViewController = [segue destinationViewController];
[noteDetailsViewController setUrl:sender];
这是屏幕截图:
【问题讨论】:
【参考方案1】:在这里我们可以感受到UIScrollView
和UICollectionView
之间的区别,但是UICollectionView
是由UIScrollView
组成的,UICollectionView
可以重新加载并相应地调整其内容,而UIScrollView
不能。
好的,现在在你的情况下,你必须重新加载(刷新)你的滚动视图,这是不可能的,因为我们可以使用 UICollectionView
或 UITableView
。
你有两个选择,
最佳选择(有点困难):将 UIScrollView
替换为 UICollectionView
- 会花费您一些时间,但更有助于降低代码复杂性和提高应用程序的性能。
糟糕的选择(简单):使用UIScrollView
保持不变 - 当您想重新加载时,删除其中的每个子视图,然后再次显示并加载所有内容。强烈不推荐。
恕我直言,您应该选择最佳选择。
【讨论】:
我选择了您的“最佳选择”,它现在可以按照我的意愿完美运行。它更简单、更快、更酷。 :) 感谢您的评论。保持良好。 :)以上是关于通过点击 UIButton 重新加载 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UITableView 重新加载期间控制过渡动画? [复制]
Jerk当用户位于UITableView的底部时重新加载UITableView