小编Józ*_*sza的帖子

使用自动布局约束动态调整表视图单元格的大小

更新

在我的最新发现之后,我完全修改了这个问题.

目标

我的目标是实现以下效果:

  1. 有一个简单的表格视图
  2. 用户选择一行
  3. 选定的行会展开,显示原始行下方的另一个标签

请注意,我知道,这可以通过插入/删除所选单元格下方的单元格来实现,我已经使用该方法成功实现了.

这次,我想尝试使用Auto Layout约束来实现这一点.

当前状态

我有一个示例项目可供任何人查看,也打开了一个问题.总结一下,这是我到目前为止所尝试的内容:

我在这里作为演员有以下观点:

  • 单元格的内容视图
  • 顶视图,包含主标签("主视图")
  • 主视图下方的底视图,包含最初隐藏的标签("详细视图")

我已经按照以下方式在我的单元格中设置了自动布局约束(请注意,这是严格的伪语言):

  • mainView.top = contentView.top
  • mainView.leading = contentView.leading
  • mainView.trailing = contentView.trailing
  • mainView.bottom = detailView.top
  • detailView.leading = contentView.leading
  • detailView.trailing = contentView.trailing
  • detailView.bottom = contentView.bottom
  • detailView.height = 0

我有一个自定义UITableViewCell子类,有多个出口,但最重要的是前面提到的高度约束的出口:这里的想法是constant默认将其设置为0,但是当选择单元格时,将其设置为44,所以它变得可见:

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    detailViewHeightConstraint.constant = selected ? detailViewDefaultHeight : 0
    UIView.animateWithDuration(0.3) {
        self.layoutIfNeeded()
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下结果:

当前状态

所以效果是有效的,但不完全是我最初的想象.我没有推动主视图,而是希望细胞的高度在显示细节视图时增长,并在隐藏时收缩. …

uitableview ios autolayout ios-autolayout

14
推荐指数
1
解决办法
4987
查看次数

iOS segue执行了两次

我有一个表视图,其中包含不同类型的表视图单元格.在其中一个单元格中,有两个按钮,按下时加载视图控制器.我使用以下功能来处理按钮按下:

- (IBAction)leftButtonPressed:(id)sender
{
    // Getting the pressed button
    UIButton *button = (UIButton*)sender;
    // Getting the indexpath
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    // Loading the proper data from my datasource
    NSArray *clickedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indPath.row];
    [[SOEventManager sharedEventManager] setSelectedEvent:clickedEvent[0]];
    // Everything working as it should up to this point
    // Performing seque...
    [self performSegueWithIdentifier:@"buttonSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)

我的buttonSegue应该推送一个新的视图控制器.不管怎样,而不是推动一次,它似乎是推了两次,所以我得到以下警告:

2013-11-27 01:48:30.894 Self-Ordering App[2081:70b] nested push animation can result in corrupted navigation bar 
2013-11-27 01:48:31.570 Self-Ordering App[2081:70b] Finishing up a navigation …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios segue ios7

10
推荐指数
3
解决办法
1万
查看次数

watchOS 2:在初始接口控制器上设置属性

从watchOS 2开始,我们有一个ExtensionDelegate对象,类似于UIApplicationDelegate(对应用程序生命周期事件做出反应).

我想获得对第一个Interface Controller对象的引用,该对象将在启动时显示,以在其上设置属性(例如,传入数据存储对象).

根据文档,手上的rootInterfaceController财产WKExtension支持初始控制器:

根接口控制器位于应用程序的主故事板中,并具有与之关联的主入口点对象.WatchKit在启动时显示根接口控制器,尽管应用程序可以在启动序列完成之前呈现不同的接口控制器.

所以我尝试以下内容ExtensionDelegate:

func applicationDidFinishLaunching() {
    guard let initialController = WKExtension.sharedExtension().rootInterfaceController else {
        return
    }

    initialController.dataStore = DataStore()
}
Run Code Online (Sandbox Code Playgroud)

即使显示正确的接口控制器,此时rootInterfaceController也是零.有趣的是,如果我在willActivate()我的Interface Controller中查询相同的属性,则属性设置正确.

在iOS应用程序中,您已经可以获得根视图控制器了applicationDidFinishLaunching(),我认为它应该对watchOS起作用.

有没有办法在界面控制器显示之前(从外部)设置属性?这是一个错误吗?

非常感谢你的回答!

ios swift apple-watch watchkit watchos-2

7
推荐指数
1
解决办法
1458
查看次数

在ViewPager中多次使用一个片段

是否可以多次在viewpager中使用一个片段?我正在尝试使用ViewPager构建动态更新的UI.我想使用相同的设计,基本上相同的片段,每个页面都有不同的数据,比如listview适配器.

android dynamic fragment android-viewpager

6
推荐指数
1
解决办法
6259
查看次数

AFNetworking 2.0:是否可以将纯json放入POST请求的主体中?

我想从我的应用程序发出以下请求:

AFHTTPRequestOperationManager *requestManager = [[AFHTTPRequestOperationManager alloc] init];
requestManager.responseSerializer.acceptableContentTypes = [requestManager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/json"];
requestManager.requestSerializer = [AFJSONRequestSerializer serializer];
[requestManager POST:urlString parameters:aParameters constructingBodyWithBlock:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
{
    NSLog(@"%@", responseObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
    NSLog(@"error: %@", error);
}];
Run Code Online (Sandbox Code Playgroud)

其中aParameters是具有以下内容的NSDictionary:

NSDictionary *urlParams = @{@"username" : anUser.userName, @"password" : anUser.password};
Run Code Online (Sandbox Code Playgroud)

当我使用用户输入"anUsername"和"aPassword"从我的应用程序发出请求时,我在servlet中获取了以下日志:

--Boundary+5738A89B2C391231
Content-Disposition: form-data; name="password"

aPassword
--Boundary+5738A89B2C391231
Content-Disposition: form-data; name="username"

anUsername
--Boundary+5738A89B2C391231--

multipart/form-data; boundary=Boundary+5738A89B2C391231
Run Code Online (Sandbox Code Playgroud)

我的印象是使用AFJSONRequestSerializer会以适当的格式发送我的请求,但是正如日志所示,它是多部分/表单数据.解析这种请求真的很难(对我来说)(我在服务器端用Java解析它),所以我的问题是:是否有可能在我的请求正文中发送一个json?像这样的东西:

{
    "userName" : "anUsername",
    "password" : "aPassword"
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

json http-post ios afnetworking-2

6
推荐指数
1
解决办法
6441
查看次数

Objective-C中的Casting方法参数

更新

好的,首先,谢谢大家的大量活动.似乎我没有把我的问题说得太好,因为许多答案(正确地)都停留在id输入参数上,并且遵循不良的设计模式,但它仅仅是一个例子.我将在我的问题中添加一些上下文:

  • 假设存在多个不同的实现doSomethingWithParameter:,需要特定实例作为输入参数
  • 我的示例中的类只会SpecificClass作为输入参数的实例调用

有了这些断言,这是我的假设:鉴于您知道参数的类型,在类型检查和铸造方面没有任何好处,只是为了更加安全.

原帖

假设我的协议声明中有一个通用方法,它接受一个id输入参数:

@protocol MyProtocol <NSObject>

- (void)doSomethingWithParameter:(id)inputParameter;

@end
Run Code Online (Sandbox Code Playgroud)

在符合的类中MyProtocol,我通常更喜欢将类型inputParameter显式化为:

- (void)doSomethingWithParameter:(SpecificClass *)inputParameter
{
    /... do something with param
}
Run Code Online (Sandbox Code Playgroud)

偶尔我会因为选择此解决方案而受到批评,而不是以下方面:

- (void)doSomethingWithParameter:(id)inputParameter
{
    if ([inputParameter isKindOfClass:[SpecificClass class]]) {
        SpecificClass *myInstance = (SpecificClass *)inputParameter;
        /... do something with param
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的更喜欢第一个版本,因为它清楚地说明了我的实例所期望的参数.它更简洁,更清晰.我通常不认为我可以从类型检查/铸造中获得太多收益.

我的问题:从编码标准的角度来看,哪一个是更好的解决方案?第一个有缺点吗?

types casting objective-c ios

2
推荐指数
1
解决办法
336
查看次数

[__NSCFNumber length]:发送到实例的无法识别的选择器

我试图将数据从表视图控制器传递到详细视图控制器.我的表的每个条目都可以正常工作,除了一个.这是prepareForSegue方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"showDetails"]) {
        NSIndexPath *indexPath = [[self tableView] indexPathForSelectedRow];
        NSDictionary *notification = [[self notifications] objectAtIndex:[indexPath row]];
        NRDetailViewController *destViewController = [segue destinationViewController];
        [destViewController setDate:[notification objectForKey:@"date"]];
        [destViewController setFrom:[notification objectForKey:@"from"]];
        [destViewController setIden:[notification objectForKey:@"identifier"]];
        [destViewController setPriority:[notification objectForKey:@"priority"]];
        [destViewController setSubject:[notification objectForKey:@"subject"]];
        [destViewController setMessage:[notification objectForKey:@"text"]];

    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的详细视图界面:

#import <UIKit/UIKit.h>

@interface NRDetailViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *dateField;
@property (weak, nonatomic) IBOutlet UITextField *fromField;
@property (weak, nonatomic) IBOutlet UITextField *idenField;

@property (weak, nonatomic) IBOutlet UITextField *prioField;
@property …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios

1
推荐指数
1
解决办法
1万
查看次数