5

スポットを占める人のリストがあります。ユーザーがこれらの人々を別の場所に再配置できるようにしたいのですが、一部の場所は立ち入り禁止です。これは、UITableViewの再配置機能を使用して最も簡単に実現できると思いました。しかし、利用できない場所を静止させておく方法がわかりません。

たとえば、ActiviaBoulangerをスポット5に移動したいとします。灰色のセルは動かせないセルである必要があります。

最初のビュー:

始まり

UITableViewが自動的に行うこと:

UITableViewの機能

UITableViewに実行させたいこと:

欲しいもの

設定tableView:canMoveRowAtIndexPath:すると、セルを移動できなくなるだけのように見えますが、他のセルの動きに反応してセルが移動するのを防ぐことはできません。

どんな助けでも大歓迎です。ありがとう


更新:以下は、問題のセットアップを含むサンプルコードです。それらはすべて失敗し、物事を混乱させるため、私は解決策への私の努力を含めませんでした。

#import "LDYViewController.h"

static NSString * unmoveableCellId = @"NoMove";
static NSString * moveableCellId = @"OkMove";

@implementation LDYViewController
@synthesize tableView;
@synthesize peopleList;

- (void)viewDidLoad
{
    [super viewDidLoad];

    peopleList = [[NSMutableArray alloc] initWithObjects:
                  @"Belinda Boomer", @"Activia Boulanger", @"Arnold Carter", [NSNull null], @"Attila Creighton", [NSNull null], @"Bruce Cleary", [NSNull null], nil];
    [tableView setEditing:YES];
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return peopleList.count;
}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;

    if([peopleList objectAtIndex:indexPath.row] == [NSNull null]) {
        cell = [tableView dequeueReusableCellWithIdentifier:unmoveableCellId];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:unmoveableCellId];
            cell.userInteractionEnabled = NO;
            cell.contentView.backgroundColor = [UIColor grayColor];
        }
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:moveableCellId];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:moveableCellId];
            NSString * name = [peopleList objectAtIndex:indexPath.row];
            cell.textLabel.text = name;
        }        
    }

    return cell;
}

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
}

- (NSIndexPath *)tableView:(UITableView *)tableView
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
       toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
    return proposedDestinationIndexPath;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([peopleList objectAtIndex:indexPath.row] == [NSNull null]) {
        return NO;
    }

    return YES;
}    
@end
4

5 に答える 5

9

これを試して:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath*)sourceIndexPath
       toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath

提案されたDestinationIndexPathを確認できます。行を移動したくない場合は、sourceIndexPathを返すことができます。その後、行が戻されます。それ以外の場合は、proposedDestinationIndexPathが返されます。

于 2012-04-18T04:14:08.763 に答える
2

モデルで通常の再配置ロジックを実行し、それが完了したら、nullを必要な場所に戻します。投稿されたコードにはモデルが含まれていないため、以下に説明するためのもっともらしいモデルを示します。

// always leave our array with a null at indexes 3,5,7
// i'm sure you have better logic about where nulls go, but just to illustrate
- (void)addNulls {

    NSMutableArray *answer = [NSMutableArray array];
    for (id object in self.peopleList) {
        if (![object isKindOfClass:[NSNull self]]) {
            [answer addObject:object];
        }
    }

    assert(answer.count >= 4);
    [answer insertObject:[NSNull null] atIndex:3];
    [answer insertObject:[NSNull null] atIndex:5];
    [answer insertObject:[NSNull null] atIndex:7];
    self.peopleList = answer;
}

// build a pretend model with nulls
- (NSMutableArray *)peopleList {

    if (!_peopleList) {
        _peopleList = [NSMutableArray array];
        [_peopleList addObject:@"Moe"];
        [_peopleList addObject:@"Larry"];
        [_peopleList addObject:@"Curly"];
        [_peopleList addObject:[NSNull null]];
        [_peopleList addObject:@"Groucho"];
        [_peopleList addObject:[NSNull null]];
        [_peopleList addObject:@"Chico"];
        [_peopleList addObject:[NSNull null]];
        [_peopleList addObject:@"Harpo"];
    }
    return _peopleList;
}



// normal rearrange logic, then fix your array up
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {

    // reorder the list with the typical logic, ignoring nulls
    NSString *stringToMove = [self.peopleList objectAtIndex:fromIndexPath.row];
    [self.peopleList removeObjectAtIndex:fromIndexPath.row];
    [self.peopleList insertObject:stringToMove atIndex:toIndexPath.row];

    // now put nulls into the positions you want them
    [self addNulls];
    [self.tableView reloadData];
}
于 2012-04-19T02:35:41.827 に答える
2

私も同様の問題に直面し、それを解決しました。

2つのセクションを作成し、すべての灰色の行をセクション2に配置します。

-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{

if (proposedDestinationIndexPath.section == 1)
    return sourceIndexPath;
else
    return proposedDestinationIndexPath;

}

于 2012-04-18T06:03:49.263 に答える
0

これは、次を使用して行うことができます。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{

このメソッドでは、from indexIndexPathとtoIndexPathをチェックして、ユーザーが無効な位置に移動していないかどうかを確認する必要があります。テーブルビューのデータソースを変更して、セルを元に戻すか、正しい位置に移動します。

于 2012-04-18T02:15:44.287 に答える
0

Swiftの実装

class TableViewMovable: UITableView, UITableViewDelegate, UITableViewDataSource {

var arrDataSource = [[String:Int]]()

override func awakeFromNib() {
    super.awakeFromNib()
    commonInit()
}

func commonInit(){

    dataSource = self
    delegate = self
    isEditing = true

    register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrDataSource.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") {
        cell.textLabel?.text = arrDataSource[indexPath.row].keys.first!
        let val = arrDataSource[indexPath.row].values.first!
        cell.backgroundColor = val % 2 == 0 ? UIColor.gray.withAlphaComponent(0.5) : UIColor.lightGray.withAlphaComponent(0.5)
        return cell
    }else{
        return UITableViewCell()
    }
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    return .none
}
func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
    return false
}

func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let movedObject = arrDataSource[sourceIndexPath.row]
    arrDataSource.remove(at: sourceIndexPath.row)
    arrDataSource.insert(movedObject, at: destinationIndexPath.row)
    debugPrint("\(sourceIndexPath.row) => \(destinationIndexPath.row)")

}

func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return true
}

}

これが誰かを助けるかもしれないことを願っています。

于 2018-07-24T10:15:54.867 に答える