小编Rob*_*egg的帖子

为什么这个代码适用于iPhone 5,4和4但不适用于5s?

我有以下代码为UIBarButton我的项目添加一些s.这适用于以下情况:

全部在iOS 7.1上

  • 模拟器iPhone Retina 3.5英寸;
  • 模拟器iPhone Retina 4英寸;
  • 模拟器iPhone Retina 4英寸(64位)
  • Iphone 4
  • iPhone 4s

我没有iPhone 5设备可以测试.

它不适用于新的iPhone 5s.有什么不同?

这是代码:

    -(void)setupNavigationBar
{
    self.saveSearchButton =  [UIButton buttonWithType:UIButtonTypeCustom];
    [self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search"] forState:UIControlStateNormal];
    [self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search Active"] forState:UIControlStateHighlighted|UIControlStateSelected];
    [self.saveSearchButton addTarget:self action:@selector(saveSearchButtonpressed)forControlEvents:UIControlEventTouchUpInside];
    [self.saveSearchButton setFrame:CGRectMake(0, 0, 23, 31)];

     self.changeLayutButton =  [UIButton buttonWithType:UIButtonTypeCustom];
    [self.changeLayutButton setImage:[UIImage imageNamed:@"View List"] forState:UIControlStateNormal];
    [self.changeLayutButton setImage:[UIImage imageNamed:@"View Grid"] forState:UIControlStateHighlighted|UIControlStateSelected];
    [self.changeLayutButton addTarget:self action:@selector(changeViewLayoutButtonPressed)forControlEvents:UIControlEventTouchUpInside];
    [self.changeLayutButton setFrame:CGRectMake(0, 0, 23, 31)];

    self.sortByButton =  [UIButton buttonWithType:UIButtonTypeCustom];
    [self.sortByButton setImage:[UIImage imageNamed:@"Sort By"] forState:UIControlStateNormal];
    [self.sortByButton …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios

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

从Appdelegate访问UITabBarController

我试图从UIWindow中的UIViewController访问我的UiTabBarController,

由于它不属于UITabBarController - 使用self.tabBarController..将无法正常工作,因为它将是零.

所以我尝试了这段代码:

BBAppDelegate *appDelegate = (BBAppDelegate *)[[UIApplication sharedApplication] delegate];

    UITabBarController *tabBarController = appDelegate.window.rootViewController.tabBarController;
Run Code Online (Sandbox Code Playgroud)

当它使用调试器逐步执行代码时 - 我可以看到appDelegate有一个tabBarController并且它不是nil.但是在下一行

  UITabBarController *tabBarController = appDelegate.window.rootViewController.tabBarController;
Run Code Online (Sandbox Code Playgroud)

这导致tabBarController的实例是零和tabBarControllerappDelegate仍然有一个内存地址分配给它,它不是零.

我在这做错了什么?

编辑

这是我的调试器的样子:

在此输入图像描述 谢谢!

编辑2

这是我设置添加到rootViewController的侧边菜单的人

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone"
                                                         bundle: nil];

BBFilterViewController *loginController=[[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"FilterViewController"];  UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:loginController];



self.tabBarController = [mainStoryboard instantiateViewControllerWithIdentifier: @"HomeScreen"];

MVYSideMenuOptions *options = [[MVYSideMenuOptions alloc] init];
options.contentViewScale = 1.0;
options.contentViewOpacity = 0.5;
options.shadowOpacity = 0.0;

MVYSideMenuController *sideBarController = [[MVYSideMenuController alloc]initWithMenuViewController:navController …
Run Code Online (Sandbox Code Playgroud)

objective-c ios

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

Firebase运行时崩溃 - FIRInstanceIDConfig

我已将Firebase SDK手动添加到我的项目中.(由于配置问题,无法使用cocoapod.)

我使用以下框架

FirebaseCore.framework        
FirebaseInstanceID.framework
Firebasemessageing.framework
Run Code Online (Sandbox Code Playgroud)

AppDelegate我已导入以下内容:

#import "Firebase.h
#import <FirebaseInstanceID/FirebaseInstanceID.h>
#import <FirebaseMessaging/FirebaseMessaging.h>
Run Code Online (Sandbox Code Playgroud)

如果我参考

[FIRMessaging messaging].remoteMessageDelegate = self;
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误导致运行时崩溃:

控制台中的错误消息:

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString fira_UTF32Length]:

但是,如果我注释掉并引用这行代码

 [[FIRInstanceID instanceID] token]
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [FIRInstanceIDConfig setAllowGCMRegistrationWithoutAPNSToken:]:发送到实例的无法识别的选择器

我已经添加了我能想到的所有必需的框架,但仍然遇到了这个问题.

编辑

链接到项目的框架的完整列表:

  • 布,
  • FirebaseAnalytics
  • FirebaseCore
  • FirebaseInstanceID
  • FirebaseMessaging
  • GoogleToolboxForMac
  • GTMSessionFetcher
  • 的Protobuf
  • FirebaseAppIndexing
  • WebKit的
  • LocalAuthentication
  • 安全
  • 的ImageIO
  • 素材资源库
  • CoreData
  • UIKit的
  • 的libc ++.TBD
  • libsqlite3.tbd
  • libGoogleAnalyticsServices.a
  • libAdIdAccess.a程式

堆栈跟踪:

这是它崩溃的线程:

    0   ???                                 0x00000001057f0a44 0x0 + 4387179076,
1   MyApp                            0x000000010050f220 main + 0,
2   libsystem_c.dylib                   0x0000000181363400 abort + 140, …
Run Code Online (Sandbox Code Playgroud)

objective-c ios firebase firebase-cloud-messaging

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

UIActivityIndi​​catorView 在 UICollectionViewCell 中不旋转

我有一个自定义单元格加载在我的集合视图的底部。它唯一的工作是显示活动指示器视图 - 这在应用程序进行新的工作调用时发生。

所以我将它添加到单元格中,如下所示:

BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];


UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
activityIndicator.center = loaderCell.imageView.center;
activityIndicator.tag = 10;

[loaderCell.imageView addSubview:activityIndicator];

    [activityIndicator startAnimating];
    return loaderCell;
Run Code Online (Sandbox Code Playgroud)

这在我视图的最后一个单元格中显示了一个活动指示器 - 但它不旋转。有任何想法吗?

找到解决方案

根据评论 - 这是一个线程问题。我还采纳了将代码移动到单元格的自定义 nib 文件中的建议。

这是重构的代码:

BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];
    loaderCell.backgroundColor = [UIColor clearColor];

     if (self.loadingMore == NO){
        dispatch_async(dispatch_get_main_queue(), ^{
            activityIndicator.hidden = YES;
            [loaderCell.spinner stopAnimating];
        });
    }
     else if (self.loadingMore == YES){
    dispatch_async(dispatch_get_main_queue(), ^{
        activityIndicator.hidden = NO;
        [loaderCell.spinner startAnimating]; …
Run Code Online (Sandbox Code Playgroud)

iphone uiactivityindicatorview ios uicollectionview

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

UICollectionView 在更改布局时显示旧单元格

我在 UIViewController 中有一个 UICollectionView 。我还有两种不同的布局,当按下按钮时我会更改为它们。

我在两个 nib 文件中创建的两个单元格之间的布局发生变化。由于这两个单元格做了相同的更改,并且它们的布局只是不同 - 我为它们使用了相同的类,它是 UICollectionViewCell 的子类。

因此,当我的视图加载时,我注册我的两个单元格,如下所示:

[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];
Run Code Online (Sandbox Code Playgroud)

这两个布局都是 UICollectionViewFlowLayout 的子类。在布局子类中,我只使用一种方法来设置布局/单元格的大小和间距 - 如下所示:

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(320, 80);
        self.minimumLineSpacing = 0.1f;
    }

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

这是因为在更改视图时单元格始终具有正确的大小。

要更改视图,我有一个 UIButton,其中包含以下代码:

[self.tradeFeedCollectionView.collectionViewLayout invalidateLayout];

if (!self.gridLayoutActive){

    self.gridLayoutActive = YES;
    [self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
    self.lastLayoutUsed = @"GridLayout";

}

else {

    self.gridLayoutActive = NO;

    [self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
    self.lastLayoutUsed = @"TableLayOut";
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我得到了一个很好的动画,并且两个单元格之间的视图发生变化。

问题

更改视图时,UICollectionView 的可见区域会留下旧单元格,并且尚未更新为新单元格。这些牢房实际上已经改变了形状,但旧牢房的景色却被留下了。当我开始滚动时 …

iphone objective-c ios uicollectionviewcell uicollectionviewlayout

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

如何多次使用相同的密钥构建URL?

我正在构建一个GET向URL 发出请求的iOS应用程序.对于它所做的所有请求,我从基本URL构建URL,然后使用NSDictionaryKey-Value_pairs 添加参数.

我也用它AFNetworking 2.0来发出请求 - 它也提供了URL,并提供了NSDictionary键.

我现在遇到了一个问题,我需要使用的Web服务,需要多个键是相同的,具有不同的值.无法使用此功能NSDictionary

这意味着我无法成功运行Web服务.

以下是我需要最终URL的示例 -

http://demo.domain.net/services/ .... &IncludedUserIds = 12345&IncludedUserIds = 2345

以上URL的斜体位是我尝试使用AFNetworking和NSDictionary构建的.我怀疑我将不得不使用比NSDictionary更高级的东西来解决这个问题.

有没有人有任何想法?

编辑

如果我使用NSSet设置我的NSDictionary参数,找到一半解决方案:

    [self.parameters setObject:[NSSet setWithObjects:@"12345",@"2345", nil] forKey:@"IncludedUserIds"];
Run Code Online (Sandbox Code Playgroud)

这是我需要的.不过我有一个跟进问题:

需要将值动态添加到NSSet中 - 如何创建可在运行时接受额外值的NSSet?

objective-c ios afnetworking-2

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

将UIButton放置在与UITabBar相同的空间中(隐藏时)

我有一个UITabBarController我正在开发的基础应用程序.在我的屏幕设计之一,我需要隐藏标签栏(我做UIViewsetHidden方法),那么我放在一个UIView,其中tabBar通常会并添加一个UIButtonUIView.但是,当点击按钮时,我没有得到任何回应.该按钮不会收到任何触摸事件.

我已经查看了解决方案的一些问题和答案.但是大多数都需要子类化.我已经尝试了子类化并重写了HitTest事件,但是即使在我的UIButton子类中也没有调用该方法.

我正在开发iOS 7.1.

任何人都可以对此有所了解,以及如何让按钮响应触摸事件?

编辑

我的自己和@Geet更仔细地研究了这个问题.似乎任何东西放置在与UITabBar不接收触摸事件相同的空间中.作为测试,我创建了一个新项目,其中包含很少的代码,可以复制我原来的项目设置.

在示例应用程序中,我们在第一个选项卡中UIViewController嵌入了一个UITabBarController.这UIViewController是再嵌入一个UINavigationController.从那里,我们将第二个UIViewController推入堆栈.

点击顶部的"隐藏标签栏"按钮即可.隐藏tabBar.它暴露了UIView放置在那里的绿色storyboard,其中一个UIButton连接到ViewControllers实现文件.此按钮根本不会接收任何触摸事件.只要我将按钮移动到TabBar通常占据的空间上方,按钮就会起作用.将其向下移回屏幕底部 - 按钮不再起作用.

似乎苹果已禁止所有触摸事件UITabBar.我想知道这有什么办法吗?

我试过了:

self.tabbar.userInteractionENabled = NO;
Run Code Online (Sandbox Code Playgroud)

这也没有帮助.

也许有一种方法,我们能够覆盖在子类中UITabbarController,当UITabBar隐藏时,允许触摸此规范?

如果有人想要使用示例项目 - 它在我的gitHub上:

https://github.com/TanderZA/UIButton-in-UITabbar-Space

objective-c uibutton uiview ios

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

带有 Android 架构组件的 MVVM

我正在探索新的 Android 架构组件,并希望将其实现到 Android 应用程序中。我对 MVVM 很坚定,因为我在 iOS 开发中使用了该范例。阅读 Google 提供的 Android 架构组件指南: https: //developer.android.com/topic/libraries/architecture/guide.html

我只有几个问题...

在上面提到的指南中,Google 使用访问这些 Web 服务 API 的类 -如果应用程序上只有一个屏幕需要来自 REST API 的数据,那么UserRepository他们继续将此类设为 a ,这可能没问题。Singleton

我关心的是这个;谷歌似乎主张需要在每个 ViewModel 的基础上创建一个存储库类。这对我来说听起来很错误,因为Singlton应用程序中有这么多课程。如果我们有 10 个屏幕,有 10 个 ViewModel(每个视图模型都需要自己的Repository module),那么我们的应用程序中就会有 10 个单例。从 iOS 开发者的角度来看,有这么多是错误的。

解决此问题的方法是使用一个中介器(存储库)类,该类具有公共方法,公开 API 以从 REST API 获取数据。Web 服务部分将位于其自己的类中。这样,我们就可以很好地分离关注点。

每个 ViewModel 有一个存储库类,还是每个应用程序有一个存储库类,这是最佳实践吗?我对此不是100%确定。

最后,我也有同样的担忧Room- Google 是说我们在每个 ViewModel 基础上创建一个数据库还是每个应用程序创建一个数据库?

android mvvm android-room android-architecture-components

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

AFNetworking iOS11-HTTP加载失败-999

我有一个在生产中运行良好的应用程序。但是,由于iOS 11-我收到此错误:

任务<51E07EF5-6F31-4E58-8818-7712CB3E49A6>。<20> HTTP加载失败(错误代码:-999 [1:89])任务<51E07EF5-6F31-4E58-8818-7712CB3E49A6>。错误完成-代码:-999

仅在iOS 11上会发生这种情况。另外,它也不是一致的。对同一URL的五个请求中,有两个将因此失败。在蜂窝连接上,它发生的频率较低,但仍然存在。

我正在使用AFNetworking,正如所说;直到iOS11,这才成为问题。

有任何想法吗?

更新以添加更多详细信息:

我正在使用带有有效证书的SSL固定。我的info.plist看起来像这样:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>url.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
Run Code Online (Sandbox Code Playgroud)

像这样使用SSL固定:

    NSString *pathToProdCert = [[NSBundle mainBundle]pathForResource:@"MY_CERT" ofType:@"cer"];

if(pathToProdCert){
       manager.securityPolicy.pinnedCertificates = [NSSet setWithObjects[NSData dataWithContentsOfFile:pathToProdCert], nil];
            manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
        }
Run Code Online (Sandbox Code Playgroud)

更新: 针对评论:这是管理器的声明方式:

@property (nonatomic) AFHTTPSessionManager *manager;
Run Code Online (Sandbox Code Playgroud)

通过我的Web服务类的init方法初始化管理器:

-(instancetype)initWithBaseUrl:(NSURL *)url {

    self  = [super init];
    if (self){
        self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
        self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    }

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

每个应用会话仅初始化一次。

更新: 根据要求,这是userInfo里面的error …

objective-c ios afnetworking ios11

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

可能有两种字体大小的NSString

是否有可能有一个NSString字体大小/颜色的第一个字和下一个字体的另一种字体大小和颜色?

我想也许NSAttributedString- 但不确定那是不是这样的路?

我尝试将两个NSString放入NSAttributedString- 但这不起作用.

寻找具有以下内容的UILabel:

LARGEString(smallString)

工作实例

到目前为止,我已经想出了这个:

        /* Set the Font Sizes */

UIFont *objectNameFont = [UIFont systemFontOfSize:14.f];
UIFont *itemsFont = [UIFont systemFontOfSize:12.f];

/* Create the attribute dictionaries */

NSDictionary *objectNameDict = [NSDictionary dictionaryWithObject:objectNameFont forKey:NSFontAttributeName];
NSDictionary *objectItemDict = [NSDictionary dictionaryWithObject:itemsFont forKey:NSFontAttributeName];

/* Create the  string */

NSString *labelFullName = [NSString stringWithFormat:@"%@ (%@)", object.name, object.items];

/* Seperate the two strings */

NSArray *components = [labelFullName componentsSeparatedByString:@" ("];
NSRange objectNameRange = [labelFullName …
Run Code Online (Sandbox Code Playgroud)

objective-c nsstring ios

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