使用静态单元格创建设置场景 - 附加截图和简单的测试用例

时间:2015-04-16 15:13:13

标签: ios iphone xcode uitableview uistoryboard

我准备了一个非常简单的测试用例项目MyStaticCells at GitHub来证明我的问题。

我正在尝试在iOS应用中创建设置屏幕 - 使用静态单元格(此处为fullscreen picture):

Xcode screenshot

您可以在下面更详细地看到设置视图控制器(此处为fullscreen picture) -

“设置”场景应为用户提供3个操作:

  • 开/关声音
  • 发送电子邮件至支持
  • 恢复购买

因为我不知道如何在使用静态单元格时在表格视图控制器的顶部创建一些空间 - 我使用了4个静态单元格并放置了齿轮图标,标题为设置和顶部静态单元格中的 Close 按钮:

Xcode screenshot

我的2个问题:

  1. 在顶部静态单元格中使用 Close 按钮时,它看起来不太好 - 因为"标题"当用户尝试滚动屏幕​​时滚动:
  2. iPhone screenshot

    1. 当用户点击一个单元格时 - 例如切换声音 - 这是有效的。但它仅在用户单击另一个单元格后才起作用:
    2. iPhone screenshot

      这是我的源代码 -

      SettingsViewController.h

      #import <UIKit/UIKit.h>
      #import <MessageUI/MessageUI.h>
      #import <MessageUI/MFMailComposeViewController.h>
      
      #define THEME_COLOR_GRAY_TEXT [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1.0]
      #define THEME_COLOR_BLUE [UIColor colorWithRed:19.0/255 green:175.0/255 blue:207.0/255 alpha:1.0]
      
      @interface SettingsViewController : UITableViewController <MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>
      
      @property (nonatomic, weak) IBOutlet UILabel *labelTitle;
      @property (nonatomic, weak) IBOutlet UILabel *labelButtonSounds;
      @property (nonatomic, weak) IBOutlet UILabel *labelButtonEmail;
      @property (nonatomic, weak) IBOutlet UILabel *labelButtonRestore;
      @property (nonatomic, weak) IBOutlet UILabel *labelButtonSoundsOnOff;
      
      @property (weak, nonatomic) IBOutlet UITableViewCell *cellSounds;
      @property (weak, nonatomic) IBOutlet UITableViewCell *cellSupport;
      @property (weak, nonatomic) IBOutlet UITableViewCell *cellRestore;
      
      - (IBAction)clickedClose:(id)sender;
      
      @end
      

      SettingsViewController.m

      #import "SettingsViewController.h"
      
      @interface SettingsViewController ()
      @property (nonatomic, assign) BOOL soundOn;
      @end
      
      @implementation SettingsViewController
      
      ......
      
      - (void)refreshView
      {
          if (self.soundOn)
          {
              self.labelButtonSoundsOnOff.text = @"On";
              self.labelButtonSoundsOnOff.textColor = THEME_COLOR_BLUE;
          }
          else
          {
              self.labelButtonSoundsOnOff.text = @"Off";
              self.labelButtonSoundsOnOff.textColor = THEME_COLOR_GRAY_TEXT;
          }
      
          NSLog(@"refreshView: %d", self.soundOn);
      }
      
      - (void)clickedSound
      {
          NSLog(@"clickedSound");
          self.soundOn = !self.soundOn;
          [self refreshView];
      }
      
      - (IBAction)clickedClose:(id)sender
      {
          [self.navigationController popViewControllerAnimated:YES];
      }
      
      #pragma mark -
      #pragma mark Table View delegate
      - (void)tableView:(UITableView *)tableView 
            didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
      {
          UITableViewCell *clickedCell = 
              [self.tableView cellForRowAtIndexPath:indexPath];
      
          if (clickedCell == self.cellSounds)
              [self clickedSound];
          else if (clickedCell == self.cellSupport)
              [self clickedSupport];
          else if (clickedCell == self.cellRestore)
              [self clickedRestore];
      }
      
      @end
      

      你可以看到,我已经在这个问题上付出了很多努力,请帮忙。

      在我的真实项目中,我有许多场景,自定义按钮与文本标签重叠 - 我想用静态单元替换。

      更新

      经过rdelmar和Viral Savaj(谢谢)的精彩回答后,我将方法重命名为tableView:didSelectRowAtIndexPath:,禁用了弹跳和禁用顶行的选择(以便点击时不会改变颜色):

      screenshot

      此外,我给出了顶行较小的高度

      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
          return ([indexPath row] == 0 ? 70 : 120);
      }
      

      清除选择:

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
          UITableViewCell *clickedCell = [self.tableView cellForRowAtIndexPath:indexPath];
          [tableView deselectRowAtIndexPath:indexPath animated:YES];
      
          if (clickedCell == self.cellSounds) {
              [self clickedSound];
          } else if (clickedCell == self.cellSupport) {
              [self clickedSupport];
          } else if (clickedCell == self.cellRestore) {
              [self clickedRestore];
          }
      }
      

      我仍然有两个小问题:

      1. 如何摆脱细胞之间的灰线?
      2. 如果我想要标题并且关闭按钮不在第一行 - 这样它们就不会滚动并始终可见 - 是否有这样做的方式&#34;视觉和#34;在Interface Builder?

2 个答案:

答案 0 :(得分:1)

对于问题1 ,您可以将标题设置和关闭按钮放在HeaderView中

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;

问题2.1的解决方案

只需删除所有类型的反弹,例如反弹,反弹变焦,从故事板图片右侧的属性检查器垂直弹回。

问题2.2解决方案

您可以在更改声音后立即重新加载UITableView(在声音发生变化的情况下)。

HTH,享受编码!!

答案 1 :(得分:1)

在表视图顶部创建空间的方法是使用contentInset属性

self.tableView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);

您的第二个问题是因为您错误地实施了tableView:didDeselectRowAtIndexPath:而不是tableView:didSelectRowAtIndexPath: