10252


現在、ボタン２をAttributesInspectorでHiddenにチェックをつけ使えないようにしています、これをナビゲーションバーに設置したボタン１を押すとボタン２がHidden
= NOになり、ボタン２が使える状態にしたいです。

コードは

ViewController.m

[code]

    #import "CollectionHeaderView.h"
    
    - (void)willTrash:(UIBarButtonItem *)sender
    {
        //削除ボタンを表示Hidden = NOに
        CollectionHeaderView *collectionView = [[CollectionHeaderView
    alloc] init];
        [collectionView sectionCanSee];
    }
    
[/code]

CollectionHeaderView.h

[code]

    @property (weak, nonatomic) IBOutlet UIButton *tappedSectionDelete;
    
[/code]

CollectionHeaderView.m

[code]

    - (void)sectionCanSee
    {
        NSLog(@"ここは実行される");
        self.tappedSectionDelete.hidden = NO;
    }
    
[/code]

これで実行してもうまくいきません。  
どなたか宜しくお願いします。


CC BY-SA 3.0
2015-05-15T09:55:38.073
10226
2015-05-19T06:51:42.903
8802
question
objective-c iphone
ボタンのhidden変更について


~~  
コードの一部しか載っていないのでだいぶ推測が混じってしまいますが、  
おそらく`CollectionHeaderView`を`Storyboard`上に配置（あるいは`viewDidLoad`とかで追加）しているのだろうという前提で記載します。

`ViewController`上に配置した`View`の状態を変えるにはその`View`のインスタンスに対して処理を実行してあげる必要があります。

なので、`ViewController`の処理をこんな感じに変更してみてください。

[code]

    #import "CollectionHeaderView.h"
    
    @property (weak, nonatomic) IBOutlet CollectionHeaderView *collectionView;
    
    - (void)willTrash:(UIBarButtonItem *)sender
    {
        //削除ボタンを表示Hidden = NOに
        [collectionView sectionCanSee];
    }
    
[/code]

`viewDidLoad`で追加しているのであれば

[code]

    #import "CollectionHeaderView.h"
    
    @implementation ViewController
    {
        CollectionHeaderView *collectionView_;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        collectionView_ = [[CollectionHeaderView alloc] initWithFrame:xx];
        [self.view addSubview:collectionView_];
    }
    
    - (void)willTrash:(UIBarButtonItem *)sender
    {
        //削除ボタンを表示Hidden = NOに
        [collectionView_ sectionCanSee];
    }
    
[/code]

~~

**----- コメントに対しての追記 -----**

追加情報ありがとうございます。  
また、返信が遅くなってしまい申し訳有りません。

[UICollectionView: How to get the header view for a
section?](https://stackoverflow.com/questions/13394282/uicollectionview-how-
to-get-the-header-view-for-a-section)  
これが最適解かは分かりませんが上記を参考にしてそれっぽい動作ができました。

ViewController.m（一部抜粋）

[code]

    @implementation ViewController
    {
        // ヘッダー格納用
        NSMutableDictionary* headers_;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // カスタムビューを登録
        UINib *nib = [UINib nibWithNibName:@"CollectionHeaderView" bundle:nil];
        [_collectionView registerNib:nib forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
        // Dictionaryの初期化
        headers_ = [NSMutableDictionary new];
    }
    
    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
               viewForSupplementaryElementOfKind:(NSString *)kind
                                     atIndexPath:(NSIndexPath *)indexPath
    {
        if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
            CollectionHeaderView* header = [_collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
            // Dictonaryに追加 ※とりあえずkeyはindexPathにしています。
            [headers_ setObject:header forKey:indexPath];
            return header;
        } else {
            return nil;
        }
    }
    
    - (void)collectionView:(UICollectionView *)collectionView
    didEndDisplayingSupplementaryView:(UICollectionReusableView *)view
          forElementOfKind:(NSString *)elementKind
               atIndexPath:(NSIndexPath *)indexPath
    {
        // 画面外に出たセクションを削除
        [headers_ removeObjectForKey:indexPath];
    }
    
    /**
     ナビゲーションバーのボタン押下時の処理
     */
    - (IBAction)tapped:(UIBarButtonItem *)sender
    {
        // Dictionaryから対象のViewを取得 ※とりあえず先頭
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        CollectionHeaderView* header = headers_[indexPath];
        // 削除ボタンを表示する
        [header sectionCanSee];
    }
    
[/code]


CC BY-SA 3.0
2015-05-15T12:37:59.477
10236
2015-05-19T06:51:42.903
2017-05-23T12:38:55.250
-1
3516
10226
answer


`cannot be connected to repeating content`エラーについて。  
`UICollectionView`の`Section
Header`はセクションごとに１つ作られる、つまり複数存在する可能性があります。なので、ストーリーボードで`Outlet`に設定しようとしても、いっぱいある`Section
Header`のうち、どれを指しているのか判断できないため、エラーになるのだと思います。

さて、解決方法について。  
`Section Header`は`UICollectionViewDataSource`の  
`collectionView:viewForSupplementaryElementOfKind:atIndexPath:`で作られますので、この機会を利用してはいかがでしょうか？

[code]

    ///セクションヘッダーを作って返す
    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
               viewForSupplementaryElementOfKind:(NSString *)kind
                                     atIndexPath:(NSIndexPath *)indexPath
    {
        CollectionHeaderView *view = 
          [collectionView dequeueReusableSupplementaryViewOfKind:kind
                                             withReuseIdentifier:"ストーリーボードで設定したIdentifier"
                                                    forIndexPath:indexPath];
    
        if (self.isButton1Pressed == YES) {
            view.button2.hidden = NO;
        }
    
        return view;
    }
    
    /// ボタン1が押されると実行される
    - (IBAction)button1Pressed:(id)sender
    {
        self.isButton1Pressed = YES;
        [self.collectionView reloadData]; //もう一度collectionView:viewForSupplementaryElementOfKind:atIndexPath:を実行したいので
    }
    
[/code]


CC BY-SA 3.0
2015-05-16T06:16:59.683
10252
2015-05-16T06:16:59.683
5274
10226
answer