searchbar / did select-deselect ios

时间:2015-11-05 17:47:17

标签: ios uicollectionview

我已经看到了一些git hub项目和SO问题,有些人以编程方式使用搜索栏为他们的项目。我也跟着这个项目project。他们创建了搜索栏对象并放置了它。但最后他们添加了一种方法"观察者"。真的我无法理解menthod。如果我没有那种方法运行我的应用程序。无法看到我的搜索栏

实际上有任何方法称为"观察者"。我是ios的新手,所以只有这个疑问。

另一个问题:

选择和取消选择集合视图单元格。我用下面的代码做了。但是当我选择一个单元格时它会改变背景颜色,但是当我再次选择相同的单元格时它不会显示到我的默认didde-select方法。如果我选​​择其他单元格,我的第一个选定单元格将变为白色根据did-de select方法的颜色

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor cyanColor];

}

//did-deselect
-(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor whiteColor];

}

这是集合视图单元格select / did de select将工作的方式。谢谢!

编辑:

我为我的项目使用了一些登录注销,它有一些集合视图。我使用了上面的git hub项目添加的搜索栏。当我按下注销按钮我的应用程序崩溃。

这是我的退出代码:

- (IBAction)logout:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];



}

当我从我的项目中删除addobserber方法时,它运行良好。但我需要显示我的搜索栏。如果我按下注销时使用我的应用程序崩溃

但我没有使用此代码:

-(void)dealloc{
    // remove Our KVO observer
    [self removeObservers];
}

是否需要插入我的代码才能正常工作

1 个答案:

答案 0 :(得分:0)

第一个问题:

在项目中,您要将观察者添加到collection view

- (void)addObservers{
    [self.collectionView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}

因此,如果对collectionView contentOffset进行任何更改,它将调用以下方法并更改搜索栏框架:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(UICollectionView *)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentOffset"] && object == self.collectionView ) {
    self.searchBar.frame = //.....
   }
}

在您的项目中,此方法处理搜索栏框架。所以,除非你真的没有找到任何使用它,否则不要删除该方法。如果你没找到你的搜索栏,你会错过它。在这种情况下,您需要在代码中的某处设置搜索栏框架。

第二个问题:

“选择和取消选择集合视图单元格。我使用下面的代码。但是当我选择一个单元格时,它会改变背景颜色,但是当我再次选择相同的单元格时它不会显示为我的默认值 - 选择方法。“

它不像那样工作。当您再次选择单元格时,方法didSelectItemAtIndexPath将被调用,您不会看到它的白色。

如果选择另一个单元格,则仅取消选择单元格。如果要手动取消选择单元格,则需要调用deselectItemAtIndexPath。同样,如果你在didSelectItemAtIndexPath上执行此操作,则在选择单元格后立即取消选择immediatley时,您不会发现太多差异!!!!