小编leo*_*ato的帖子

在窗口中找出UIBarButtonItem框架?

UIBarButtonItem没有扩展UIView,所以没有像框架属性.

但是CGRect,相对于应用程序,我有什么方法可以得到它的框架UIWindow

iphone cocoa-touch objective-c uikit

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

如何测试方法的协议?

在iOS 4之前,我曾经为每个添加一个观察者MKAnnotationView添加到地图视图中,监听它的选择方法,所以我知道用户何时点击了一个引脚.

这适用于iOS 4.2.我注意到在发布时注意到注释视图实际上正在被重用,并且它在某种程度上与观察者混淆.

所以我想我可以-mapview:didSelectAnnotationView:根据MKMapViewDelegate我的需要使用该方法,但这只是添加到iOS 4.0 SDK中.

因此,为了保持兼容性,我想在我的委托上实现这个方法,并有条件地检查MKMapViewDelegate协议上是否存在此方法,这样如果它不存在,我会将我的观察者添加到注释视图中.

我怎样才能为协议方法执行此操作,类似于我们如何检查类是否为零?

更新:

正如Daniel Dickison指出的那样,我无法使用respondsToSelector:,因为我的代表已经-mapview:didSelectAnnotationView:实现了4.0+设备.我需要的是检查该设备上的协议是否具有可选-mapview:didSelectAnnotationView:方法是否MKMapView将在其委托上查找该方法.

我最终对当前运行的iOS版本进行了测试.如果它高于4.0,MKMapView将查找该方法并调用它.

if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
    [self setupObserver];
Run Code Online (Sandbox Code Playgroud)

这解决了原始问题,但以某种方式检查方法的实际协议仍然很有趣.

iphone cocoa cocoa-touch objective-c mapkit

13
推荐指数
2
解决办法
6358
查看次数

像键盘一样显示UIPickerView,没有UITextField

我正在寻找一种方法来呈现UIPickerView用户点击的时间UIBarButtonItem.想象一下表格视图结果的过滤器.

我知道我可以使用UITextFieldinputView,但事实并非如此 - 我只有a UIBarButtonItem和a UITableView.

我已经看过使用UIActionSheet,但它看起来并不自然,特别是当它显示动画时.

UIView手动启动和关闭屏幕动画是唯一的选择吗?

该应用程序仅适用于iOS 6+和iPhone,因此我无需与任何其他版本/习语保持兼容.

uikit ios ios6

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

检测点击以显示/隐藏UINavigationBar

我是iPhone开发的新手,并没有做任何有趣的事情.我的视图层次结构如下:

UIView - UIImageView - UIScrollView - CustomView
Run Code Online (Sandbox Code Playgroud)

如何检测用户是否点击了屏幕上的任何位置,以便我可以相应地显示/隐藏导航栏?我不需要在我的CustomView上进行用户交互,但是当用户只想拖动它时,我想忽略UIScrollView上的触摸.

我已经可以使用以下命令以编程方式显示/隐藏我的视图控制器中的导航栏:

[self.navigationController setNavigationBarHidden:YES animated:YES];
Run Code Online (Sandbox Code Playgroud)

提前致谢!

iphone cocoa-touch

8
推荐指数
2
解决办法
9440
查看次数

如果我从AppStore中提取二进制文件,IAP非消耗品是否会继续工作?

我有一个免费的应用程序,目前可在Apple AppStore上获得,其中有一个非消耗品设置,可用于应用程序内购买以启用高级功能.

我的客户现在决定他们想从AppStore中提取这个二进制文件并仅提交一个高级付费版本(删除IAP需求).

我的问题是:当我从AppStore中提取这个免费二进制文件时,IAP购买会继续为那些已经安装了免费二进制文件的用户工作吗?这些当前用户是否能够购买这种非消费品并恢复购买?

我试过在Apple开发者论坛上问过这个,但是像往常一样,没有得到回应.

提前致谢!

iphone app-store in-app-purchase ios

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

为现有Xcode项目本地化添加新语言

我正在研究现有的Xcode 3.2.2通用iPhone OS项目,该项目已经针对4种语言(EN,IT,DE和FR)进行了本地化.我们现在在这个项目中添加一种新语言(JA).

每个现有的.lproj文件夹(en.lproj,it.lproj,de.lprojfr.lproj)有近60文件-包括PNG图像,HTMLS和Localizable.strings文件.这些文件中的每一个都在Xcode中的"组和文件"中显示为本地化组.它们遍布整棵树.

如果我Localizable.strings在Xcode,Get Info中右键单击其中一个组(例如),单击"添加本地化"并键入" ja" - 正如Xcode文档所示,没有任何反应.从我在这个新组中读到的内容,可能是因为这些文件夹的命名方式.如果他们被命名为English.lprojItalian.lproj,这应该是有效的.

因此,对于我实际将新语言本地化文件导入现有组,我必须:

  1. 右键单击本地化组文件.
  2. 选择"添加现有文件".
  3. 选择文件ja.lproj夹中的相应文件.

我即将获得一个ja.lproj包含这60个本地化文件的新文件夹,并希望以不涉及搜索组和树中的每个文件并执行这些步骤的方式在项目中导入它们...这60个文件中.

那可能吗?是否有正确(或更好)的方式将新语言导入此Xcode项目?

iphone xcode cocoa localization

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

使用指向NSData的指针序列化struct

我需要为Objective-C Trie实现(github上的NDTrie)添加某种归档功能,但我对C及其数据结构的经验很少.

struct trieNode
{
    NSUInteger key;
    NSUInteger count,
    size;
    id object;
    __strong struct trieNode ** children;
    __strong struct trieNode * parent;
};

@interface NDTrie (Private)
- (struct trieNode*)root;
@end
Run Code Online (Sandbox Code Playgroud)

我需要的是NSData从该根创建一个树结构 - 或者以其他方式序列化/反序列化整个树(符合NSCoding?),但我不知道如何使用NSData和包含指针的C结构.

反序列化生成的对象的性能至关重要,因为这是一个iPhone项目,每次应用程序启动时我都需要在后台加载它.

实现这一目标的最佳方法是什么?

谢谢!

c iphone cocoa serialization objective-c

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

在[tableview reloadData]之前重新加载UITableViewController的模型

这是我第一次尝试iPhone开发,我有一些UITableViewController将显示从Web服务返回的数据.

在我的AppDelegate中,我设置了一个每隔几秒调用一次的计时器并重新加载模型.我保留相同的对象引用并只刷新它的内容,所以我在UITableViewController目前可见的任何对象上都有相同的对象.

当数据在AppDelegate上刷新时,我调用:

[[(UITableViewController *)[self.navigationController topViewController] tableView] reloadData];
Run Code Online (Sandbox Code Playgroud)

该模型基本上是一组file对象.每个file对象都有一些属性和标志.

如果当前UITableViewController是一个简单的表,其中一个部分将每个单元格映射到Array的顺序索引,则此方法非常有效files.

但我有一个UITableViewController显示此file细节的s,并根据file对象上的标志显示2或3个部分.我把这个逻辑放在这里:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if ([[_file status] intValue] & DOWNLOADING) {
        kIndexTransferSpeed = 1;
        kIndexSettings = 2;
        return 3;
    } else {
        kIndexSettings = 1;
        kIndexTransferSpeed = -1;
        return 2;   
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在这个控制器上,我-tableView:cellForRowAtIndexPath:只是一个很大的if声明,它将显示来自_file对象的属性,具体取决于indexPath.

这种方法的问题是当这个表在设备上重新加载时,我实际上可以看到它被重新加载.部分标题闪现片刻,细胞需要一些显示.特别是如果我在重新加载时滚动表.

我已经读到某个地方,我应该让自己不要对这些UITableViewController方法施加任何逻辑.但是我该怎么办?

我想过有一个特定的方法可以创建一个"数据视图模型",数据准备好被消费,- tableView:cellForRowAtIndexPath:并且在调用它的[tableView reloadData]之前由AppDelegate调用.但是每次调用它时我都必须重新创建整个"视图模型",因为它是同一个对象而我真的不知道数据模型上有什么变化.

iphone cocoa-touch objective-c uitableview

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