在编辑模式下隐藏UITableView多重选择中的复选标记

时间:2014-10-01 17:59:47

标签: ios uitableview editmode

我已经UITableView使用viewDidLoad中的以下行在编辑模式中自动设置了多个选择:

self.tableView.allowsMultipleSelectionDuringEditing = YES;
[self setEditing:YES animated:YES];

但是,我想通过更改其背景颜色来指示选择行,而不是通过自动显示在每行左侧的复选标记来选择。 (例如,在邮件应用程序中编辑电子邮件列表时出现的,或在this SO question中讨论过时出现的那些。)我已经让它在大多数情况下工作,除了我不能获取那些在UITableView进入编辑模式时自动创建的复选框,以便离开。

以下是我正在使用的代码:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _Hierachy.cellCount;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *testCell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(testCell == nil) {
        testCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    [[testCell textLabel] setText:@"Test Cell"];

    return testCell;
}

这是我到目前为止唯一的UITableView方法,所以其他一切都应该是默认行为。

有人知道如何在编辑模式下隐藏左边的复选标记吗?我在单元的附件部分看到了很多关于复选标记的问题,但据我所知,这是另一回事。我也看到人们谈论tableView:didSelectRowAtIndexPath:方法,但这些复选标记是在表格进入编辑模式时创建的,并在用户点击“#D;完成”时被解雇。所以这种方法似乎并不相关。

我最接近的是找到这种方法:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    return NO;
}

但这只会阻止单元格内容缩进以便为复选标记腾出空间。复选标记仍然显示。

当然,有一种方法可以隐藏这些复选标记,并且仍然允许在编辑模式下进行多项选择?或者这些检查标记是否在启用了多个选择的编辑模式下UITableView是严重的强制行为?

编辑:我(不情愿地)接受有点黑客攻击的答案,比如移动复选标记的框架,直到它离开屏幕。此应用程序供内部使用,不需要获得App Store批准。但鉴于UITableView进入编辑模式时自动创建了复选标记,我甚至不知道如何将它们作为要更改的对象。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:6)

您必须继承您的UITableViewCell并覆盖(void)setEditing:animated:方法,如下所示:

#import "MyCustomCell.h"

@implementation MyCustomCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (void)setSelectedBackgroundView:(UIView *)selectedBackgroundView
{
    //Cell Selected Color: CLEAR
    [super setSelectedBackgroundView:selectedBackgroundView];
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    //Cell Edit Mode NO Indent & Selected Color: CLEAR
    [super setEditing:NO animated:animated];
    [self setNeedsLayout];
}

@end

完成此操作后,转到Inteface Builder,让您的小组成为课程MyCustomCell的一部分。

在IB中将您的单元格作为MyCustomCell类的一部分后,在MyCustomCell.h中导入UITableViewController并修改代码中的以下内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *testCell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(testCell == nil) {
        testCell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    [[testCell textLabel] setText:@"Test Cell"];

    return testCell;
}

更新: 您还可以在TableView的tableView:editingStyleForRowAtIndexPath:

中执行以下操作
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

{
            return UITableViewCellEditingStyleNone;
}

但是你会让你的细胞缩进。要删除该缩进,您必须继承Cell。

这样做你应该很好!我刚试过它,它的工作方式就是你想要的!

答案 1 :(得分:0)

这是多选择最简单的解决方案,没有选中标记:

- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath {
    return NO;
}

这将导致使用默认选择样式(灰色或使用您的自定义选择背景)选择单元格,并且不会出现复选标记。


关于你选择的任何解决方案的一句话。用户期望跨多个应用程序获得一致的体验,这些检查标记是此一致性的一部分。确保有充分的理由改变正常的操作系统外观。

答案 2 :(得分:0)

这是如何实现:

  1. 滑动删除作品
  2. 在处于编辑模式
  3. 时,您没有看到单元格左侧的复选框,删除项目或其他任何内容
  4. 细胞缩进仍然可以正常工作(如果需要,可以将其关闭)
  5. (奖金)支持多项选择
  6. 所以 - 在你的UITableViewDelegate

    System.Reflection.TargetInvocationException was unhandled
      HResult=-2146232828
      Message=Eccezione generata dalla destinazione di una chiamata.
      Source=mscorlib
      StackTrace:
           in System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
           in System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
           in System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
           in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslateColumnMap(Translator translator, Type elementType, ColumnMap columnMap, MetadataWorkspace workspace, SpanIndex spanIndex, MergeOption mergeOption, Boolean streaming, Boolean valueLayer)
           in System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Boolean streaming, Span span, IEnumerable`1 compiledQueryParameters, AliasGenerator aliasGenerator)
           in System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
           in System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()
           in System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
           in System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
           in System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
           in System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
           in System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
           in System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
           in System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection)
           in System.Collections.ObjectModel.ObservableCollection`1..ctor(IEnumerable`1 collection)
           in Cw2.ServerWin.Window_Loaded(Object sender, RoutedEventArgs e) in C:\Users\Fennec\Documents\assessment2\Cw2\Server.xaml.cs:riga 56
           in System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
           in System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
           in System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
           in System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
           in System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject root, RoutedEvent routedEvent)
           in System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root)
           in MS.Internal.LoadedOrUnloadedOperation.DoWork()
           in System.Windows.Media.MediaContext.FireLoadedPendingCallbacks()
           in System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
           in System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
           in System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
           in System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
           in System.Windows.Interop.HwndTarget.OnResize()
           in System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
           in System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           in MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           in MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
           in System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
           in System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
           in System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
           in MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
      InnerException: 
           HResult=-2146233079
           Message=The class 'Cw2.Dish' has no parameterless constructor.
           Source=EntityFramework
           StackTrace:
                in System.Data.Entity.Core.Objects.DelegateFactory.GetConstructorForType(Type type)
                in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Emit_ConstructEntity(EntityType oSpaceType, IEnumerable`1 propertyBindings, Expression entityKeyReader, Expression entitySetReader, TranslatorArg arg, EntityProxyTypeInfo proxyTypeInfo)
                in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(EntityColumnMap columnMap, TranslatorArg arg)
                in System.Data.Entity.Core.Query.InternalTrees.EntityColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg)
                in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.ProcessCollectionColumnMap(CollectionColumnMap columnMap, TranslatorArg arg, ColumnMap discriminatorColumnMap, Object discriminatorValue)
                in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(SimpleCollectionColumnMap columnMap, TranslatorArg arg)
                in System.Data.Entity.Core.Query.InternalTrees.SimpleCollectionColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg)
                in System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslateColumnMap[T](ColumnMap columnMap, MetadataWorkspace workspace, SpanIndex spanIndex, MergeOption mergeOption, Boolean streaming, Boolean valueLayer)
           InnerException: 
    

    您还需要配置UITableView

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (self.isEditing)
        {
          return UITableViewCellEditingStyleNone;
        }
        else
        {
          return UITableViewCellEditingStyleDelete;
        } 
    }
    
    - (void)tableView:(UITableView *)aTableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    {
      (do stuff)
    }
    

    现在,如果你实际上想要多个选择;

    self.table.allowsMultipleSelectionDuringEditing=NO;
    

    然后自己管理选定的单元格。

    我在UITableViewCell子类中放置了一个自定义复选框,我也更改了值以响应

    self.table.allowsSelectionDuringEditing=YES;
    

    提问者希望用背景颜色表示选择 - 该部分应该是直截了当的。