通过点击 UIButton 重新加载 UIScrollView

Posted

技术标签:

【中文标题】通过点击 UIButton 重新加载 UIScrollView【英文标题】:Reload UIScrollView by tapping a UIButton 【发布时间】:2014-12-10 05:36:02 【问题描述】:

让我先解释一下我的项目。我的SQLIte DB 表中有一些名为“note”的数据。 在“注释”表中,我有这些字段:idnoteTokennote

我在这里所做的是从该表中将所有note 加载到NSMUtableArray 中。并根据array 内容编号创建UIButton,并将这些按钮添加到UIScrollView 中作为subViewscrollview 的按钮数和宽度会根据该数组的内容数自动生成。现在,当有人点击其中一个按钮时,它会将他带到下一个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】:

在这里我们可以感受到UIScrollViewUICollectionView之间的区别,但是UICollectionView是由UIScrollView组成的,UICollectionView可以重新加载并相应地调整其内容,而UIScrollView不能。

好的,现在在你的情况下,你必须重新加载(刷新)你的滚动视图,这是不可能的,因为我们可以使用 UICollectionViewUITableView

你有两个选择,

最佳选择(有点困难):将 UIScrollView 替换为 UICollectionView - 会花费您一些时间,但更有助于降低代码复杂性和提高应用程序的性能。

糟糕的选择(简单):使用UIScrollView 保持不变 - 当您想重新加载时,删除其中的每个子视图,然后再次显示并加载所有内容。强烈不推荐。

恕我直言,您应该选择最佳选择。

【讨论】:

我选择了您的“最佳选择”,它现在可以按照我的意愿完美运行。它更简单、更快、更酷。 :) 感谢您的评论。保持良好。 :)

以上是关于通过点击 UIButton 重新加载 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

退出应用程序并重新加载时保存 UIButton 的状态

如何在 UITableView 重新加载期间控制过渡动画? [复制]

Xcode如何在按钮上加载图片呢(当然还有文字了)

Jerk当用户位于UITableView的底部时重新加载UITableView

如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview

为啥 UIButton 上的 UIImageView 会在触摸时重新出现?