小编Rei*_*ain的帖子

在UICollectionView上调用reloadData后,不会更新contentSize

有没有人知道为什么在UICollectionView上调用reloadData后不会立即更新contentSize?

如果您需要了解contentSize,我发现的最佳工作如下:

[_collectionView reloadData];

double delayInSeconds = 0.0001;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void)
    {
        // TODO: Whatever it is you want to do now that you know the contentSize.
    });
Run Code Online (Sandbox Code Playgroud)

显然,这是一个相当脆弱的黑客,它对Apple的实现进行了假设,但到目前为止,它已被证明非常可靠.

有没有人有任何其他解决方法或知道为什么会发生这种情况?我正在辩论提交雷达,因为我无法理解为什么他们无法在同一个运行循环中计算contentSize.这就是UITableView为其整个实现工作的方式.

编辑:此问题用于引用块内的setContentOffset方法,因为我想在我的应用程序中滚动集合视图.我已经删除了方法调用,因为人们的回答集中在为什么我没有使用scrollToItemAtIndexPath内部为什么没有更新contentSize.

ios uicollectionview

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

跳转到定义转到静态库头文件的派生数据文件夹而不是静态库项目

我有一个iOS应用程序,它有一个静态库作为依赖项.根据Apple的建议设置静态库https://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

有时当我在静态库的符号上使用"跳转到定义"时,我最终会将头文件复制到应用程序的派生数据文件夹而不是静态库项目中的头文件.其他时候事情很完美.

当"跳转到定义"失败时,我会通过"管理器"窗口删除项目的派生数据文件夹,这似乎可以暂时解决问题.

有没有人知道是否有办法告诉Xcode从"跳转到定义"中排除派生数据文件夹?

xcode xcode5

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

处理容器控制器中子视图控制器的UINavigationItem更改的最佳实践?

假设我有一个容器控制器,它接受一个UIViewControllers数组并将它们放置出去,这样用户就可以左右滑动以在它们之间进行转换.此容器控制器包含在导航控制器内,并成为应用程序主窗口的根视图控制器.

每个子控制器向API发出请求并加载在表视图中显示的项列表.根据显示的项目,可以在导航栏中添加一个按钮,允许用户对表格视图中的所有项目进行操作.

因为UINavigationController仅使用其子视图控制器的UINavigationItems,所以容器控制器需要更新其UINavigationItem以与其子视图的UINavigationItem同步.

容器控制器需要处理两种情况:

  1. 容器控制器的选定视图控制器发生更改,因此容器控制器的UINavigationItem应更新自身以模仿所选视图控制器的UINavigationItem.
  2. 子控制器更新其UINavigationItem,并且必须使容器控制器知道更改并更新其UINavigationItem以匹配.

我提出的最佳解决方案是:

  1. 在setSelectedViewController:方法中查询所选视图控制器的导航项,并将容器控制器的UINavigationItem的leftBarButtonItems,rightBarButtonItems和title属性更新为与所选视图控制器的UINavigationItem相同.
  2. 在setSelectedViewController方法中,KVO到leftBarButtonItems,rightBarButtonItems和所选视图控制器的UINavigationItem的title属性,每当其中一个属性改变容器控制器的UINavigationItem时.

这是我编写的许多容器控制器的一个反复出现的问题,我似乎找不到任何有关这些问题的文档解决方案.

人们对这个问题有什么解决方案?

cocoa-touch uinavigationcontroller uinavigationitem ios

23
推荐指数
2
解决办法
5283
查看次数

如果在viewWillAppear中调用scrollToItemAtIndexPath,则在UICollectionView上未更新contentOffset

我有一个UICollectionView用于模拟iOS 7中的新日历.此集合视图位于具有selectedDate属性的控制器内.每当设置selectedDate属性时,集合视图应滚动到集合视图中的日期.

日历控制器的viewWillAppear还确保所选日期可见,因为此控制器已缓存并重复使用.

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

    [self.calendarView scrollToDate:[self selectedDate] animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

问题是,第一次显示日历控制器时滚动不起作用.集合视图的contentOffset未更新.

我目前的解决方法是使用安排滚动在下一个运行循环中进行

dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void)
{
        // Scroll to the date.
    });
Run Code Online (Sandbox Code Playgroud)

看起来当UICollectionView不在窗口中时,您无法滚动.将滚动调度到下一个运行循环,确保视图已添加到窗口并可以正确滚动.

还有其他人遇到过这个问题以及他们的解决方法吗?

ios uicollectionview

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

您能否使Xcode 5.1目标依赖项仅构建有效的体系结构?

使用Xcode 5.1 Apple已经将$(ARCHS_STANDARD)包含在arm64中.如果您的项目不支持arm64,您只需将架构构建设置更改为$(ARCHS_STANDARD_32_BIT),它就不会构建arm64.

但是,如果您有一个使用$(ARCHS_STANDARD)的目标依赖项,它将构建arm64并且您将收到错误,因为您的项目期望符号不是arm64.

有没有办法让你的目标依赖项意识到你正在构建的内容,以便构建有效的架构?

xcode objective-c llvm ios xcode5.1

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

无法在iOS 7.1中的UITableViewCell的contentView上设置clipToBounds

iOS 7的重新设计导致了视图层次结构的变化UITableViewCells.单元格的内容视图包含在一个名为的私有类中UITableViewCellScrollView.

在iOS 7 UITableViewCellScrollViewclipsToBounds设置为YESUITableViewCellContentViewclipToBounds设置为NO.

在iOS 7.1中UITableViewCellScrollViewclipsToBounds设置为NOUITableViewCellContentViewclipToBounds设置为NO.

如果你[[self contentView] setClipsToBounds:YES]在iOS 7.1中调用它会坚持下去.当在单元格上调用layoutSubviews时,UITableViewCellContentView将clipToBounds再次设置为NO.

[[self contentView] superview] setClipsToBounds:YES] 适用于iOS 7.1并将UITableViewCellScrollView的clipToBounds设置为YES,但这是一个非常脆弱的解决方案.

覆盖单元格上的layoutSubview和调用[[self contentView] setClipsToBounds:YES]工作,但是另一个简单的解决方案.

有谁知道为什么要做出这种改变并采用更强大的解决方案呢?

uitableview uikit ios ios7.1

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

自定义UIWindows在iOS 8中无法正确旋转

将您的应用程序置于横向模式并执行以下代码:

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});
Run Code Online (Sandbox Code Playgroud)

在iOS 7中,您将在整个屏幕上方获得透明的蓝色覆盖,并在5秒后消失.在iOS 8中,您将获得一个透明的蓝色覆盖,覆盖了一半以上的屏幕

设备截图

这显然与Apple在iOS 8中所做的改变有关,其中屏幕坐标现在面向接口而不是面向设备,但在真正的Apple时尚中,它们似乎在横向模式和旋转方面留下了无数的错误.

我可以通过检查设备方向是否为横向并翻转主屏幕边界的宽度和高度来"修复"这一点,但这似乎是一个可怕的黑客攻击,当Apple在iOS 9中再次更改所有内容时将会破坏.

CGRect frame = [[UIScreen mainScreen] bounds];

if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    frame.size.width = frame.size.height;
    frame.size.height = [[UIScreen mainScreen] bounds].size.width;
}

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:frame];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个问题,遇到了更好,更不易解决的问题?

编辑:我知道我可以使用UIView并将其添加到关键窗口,但我想在状态栏上放置一些东西.

objective-c uiwindow ios ios8

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

为什么点语法不能用于返回类型为instancetype的方法?

假设我在NSObject上有一个定义以下方法的类别:

+ (instancetype)allocTemplate
{
    id instance = [self new];

    return instance;
}
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

@interface FDActor : NSObject

@property (nonatomic, copy) NSString *name;

+ (void)sayHi;    

@end


@implementation FDActor

+ (void)sayHi
{
    [self allocTemplate].name;
}

@end
Run Code Online (Sandbox Code Playgroud)

[self allocTemplate].name如果自我是FDA的话,如何在编译时出错?

我知道如果你使用普通的消息发送语法,它是有效的,但我明显感兴趣的是点语法错误.

properties objective-c clang instancetype

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

Objective-C运行时:声明类型为Class(objc_class)的变量符合协议意味着什么?

Class bah = [NSString class];

id object = [bah new];
Run Code Online (Sandbox Code Playgroud)

编译完全没有问题.

Class<NSSecureCoding> bah = [NSString class];

id object = [bah new];
Run Code Online (Sandbox Code Playgroud)

返回错误"选择器'new'没有已知的类方法".

为什么第一个实例理解它可以调用+newNSObject上定义的方法但第二个实例不能?

objective-c objective-c-runtime

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

反向设计Xbox One Smartglass应用程序的API授权标头

由于微软决定将Xbox Live用户的个人资料页面置于登录墙之后,出于某些愚蠢的原因,我不得不寻找其他方法来确定Xbox Live用户是否在线.

为此,我使用了mitmproxy来确定iOS版Xbox One Smartglass应用程序的请求.似乎对于任何需要身份验证的请求,应用程序使用"XBL3.0 x = {computed auth token}"填充"身份验证"标头字段.

我已想出的是,应用程序通过执行一个POST请求来获取接入令牌https://login.live.com/oauth20_token.srf并传递形式的编码数据,其中所述属性中的一个是用户的"refresh_token".您可以通过使用mitmproxy查看任何这些请求来获取此刷新令牌.

然后,应用程序继续向https://user.auth.xboxlive.com/user/authenticate发送POST请求,传递我无法确定其来源的各种信息.以下是此请求的示例JSON有效内容:

{
    "Properties": {
        "AuthMethod": "RPS", 
        "RpsHeader": "<data removed for safety>", 
        "RpsTicket": "<data removed for safety>", 
        "SiteName": "user.auth.xboxlive.com"
    }, 
    "RelyingParty": "http://auth.xboxlive.com", 
    "TokenType": "JWT"
}
Run Code Online (Sandbox Code Playgroud)

此请求的响应包含以下JSON:

{
    "DisplayClaims": {
        "xui": [
            {
                "uhs": "<data removed for safety>"
            }
        ]
    }, 
    "IssueInstant": "2014-08-02T23:44:56.5868148Z", 
    "NotAfter": "2014-08-16T23:44:56.5868148Z", 
    "Token": "<data removed for safety>"
}
Run Code Online (Sandbox Code Playgroud)

连接在一起的"uhs"和"token"的内容似乎是"XBL3.0 x ="授权标头中缺少的身份验证令牌.

问题是我对微软的网络堆栈完全不熟悉,经过几个小时的搜索,我无法弄清楚"RpsHeader"和"RpsTicket"的价值来自哪里.

reverse-engineering xbox windows-live-id mitmproxy xbox-one

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