IBOutlet connect fails to connect to renamed target - xcode

So, I was following along a core-data tutorial RayWenderlich.com part 1/3 circa 2012 using Xcode 8. Naturally some things are different now, like the default view controller and storyboards vs xib being used.
So rather than explicitly creating a xib for the MasterViewController, etc. (I instead did things the Xcode 8 way), I just renamed the supplied ViewController, and the associated .h and .m contents to MasterViewController. All was fine until I got to the step to add its outlet in the app delegate.
No joy.
Snippet shows the outlet is there but I cannot link to it.
I uploaded the project to ScaryBugsMac on github as I'm stuck what's wrong. Tried suggestions on similar question to remove/add, import vs include for the header, and to publish the outlet by putting it in the app delegate header.
I'm thinking the rename isn't being handled but I want to know how it's broken and how to fix it.

Well I punted and restarted, this time without renaming the controller. Find "part 1" of the tutorial in ScaryBug on github.

Related

Xcode drag and drop ViewController from one project to another

It happens that the IBOutlets in the new project are connecting to the storyboard of the original project? How to avoid? Or how to disconnect from the ViewController code?
Here you can see MainStoryboard_iphone is storyboard in original project, Main_iPhone_storyboard is storyboard in the new project.
Thanks.
I would suggest a simple hack if you don't have a lot of classes - create new files for every header file where you declare your IBOutlets and copy over the code - it might as well solve the problem.

How to get your custom content drawn in Interface Builder?

I watched the "What's New in Interface Builder" session video and tried to replicate the code that was showed but unfortunately when I assign a view to my custom class which has #IBDesignable I get 2 errors:
Main.storyboard: error: Live Views: Failed to update auto layout status: The bundle “swiftTest” couldn’t be loaded because its executable isn’t loadable.
Main.storyboard: error: Live Views: Failed to render instance of _TtC9swiftTest14ControllerView: The bundle “swiftTest” couldn’t be loaded because its executable isn’t loadable.
Later on in the video I saw that to have Live Views you have to make these steps:
1. Create framework
2. Create class
3. Mark as designable
How do I make the 1st step?
Thanks
As I understand it at the moment (prior to Xcode 6 Beta 3), #IBDesignable will only work from a view declared in a separate framework target.
However, I also struggled to add it because I had no "plus" button as described in various links (because the Hide Project & Target Lists arrow option was toggled off).
So, select your current project target, then just use the xcode menu options:
Editor > Add target...
Then select
Framework & Library > Cocoa Touch Framework etc.
By the way, to test #IBDesignable, this tutorial worked perfectly as a starting point:
http://www.weheartswift.com/make-awesome-ui-components-ios-8-using-swift-xcode-6/
One small but important thing to note in that tutorial (if you follow it onscreen instead of following on to its full github code listing) is that your view class must be prepended/decorated with #IBDesignable, e.g.
class CustomView : UIView {...}
should be
#IBDesignable class CustomView : UIView {...}
You should make new framework as a target for current project and add your live views in this framework. On General tab on main target you will see your framework in Embedded Binaries section.
I had a project with live views working and at one point I also had these error messages. This went away for me when closing XCode and restarting, fwiw.
It is working very well (and easily) for me with Swift in Xcode 6 Beta 5.
I've confirmed that with Xcode 6 Beta 5 I did not need to add any frameworks (for example, Cocoa Touch framework option under frameworks in the dialog that appears when adding a new project target). Nor did I need to add IBDesignable.h to the project. Both seem to be outdated requirements as per the the weheartswift.com write-up linked in the initial answer to the question.
All I needed to do was:
Prefix class definition of my custom Swift class source file
with keyword #IBDesignable
Prefix vars I wanted to show up in IB Attributes Inspector with #IBInspectable (IB recognizes several common variable types).
Then, after assigning my custom component's (UIControl subclass) name to IB's "Class" name file (under Identity Inspector tab, in right pane) replacing "UIView" -- e.g. the class name of the UIView placeholder object I originally dragged onto the IB VC's view -- upon selecting my custom component from the Content View component list in IB, I saw all my custom class' inspectable items show up in the IB Attributes Inspector!! Very cool.
Note: At first XCode would only allow me to prefix one variable with #IBInspectable. It showed errors on subsequent ones. Then, suddenly it seemed to work, and no more problems after that. Not sure if it was a typo or just took Xcode awhile to re-index my project and pre-compile or parse the code.
I code about #IBDesignable & #IBInspectable,
firstly, I got two errors like you,
then, I change the code I wrote,
you can checkout the code from my github
Good Luck.

Adding multiple Cib / Xib files in Cappuccino

Currently I'm working on a product that uses the Cappuccino Framework and the Objective-J language.
I created my project using this command after installing Cappuccino: capp gen -t NibApplication Myapp
The Problem I'm facing is that I want to keep my code and GUI clean.
By doing so I wanted to split the GUI up in separate Xib / Cib (compiled version Cappuccino can read) and separate controllers, like I do with iOS and Mac apps.
I couldn't find on the internet or on the docs how to do so.
Also, all the examples (including the NibApplication template) contains only 1 xib file.
In short what I'm after is to load a controller, based on a XIB file which holds the window. All the outlets are connected to the controller I loaded.
Is there anyone who knows how to do it?
Thanks in advance and have a nice day!
The typical way to do this is to use a CPWindowController or a CPViewController for each xib you want to load. Here's what it might look like:
var myViewController = [[CPViewController alloc] initWithCibName:"mynib" bundle:[CPBundle mainBundle]];
This would load Resources/mynib.cib from your main bundle. Normally you'd also subclass CPViewController so as to give yourself a convenient spot for your control code.
Fixed it myself! I used this tutorial: http://vimeo.com/8948460
But instead of using atlas I used XCode. Just follow the steps but with XCode and you'll be fine if you want the above to happen.

Why does Xcode 5 assistant editor defaults to .m file

I realized that when launching assistance editor while working on a XIB file no longer opens the header file by default, instead it shows the implementation file. Is there a new workflow going on I am not aware of? While in the implementation file I can only seem to be able to add IBActions. What is the "new" way to create IBOutlets? Switching to header file each time??
My 2 Cents:
When you create a new class using the Xcode templates, it usually provides a class extension in the implementation file for private properties. It makes a lot of sense to actually link the IBOutlets and IBActions there, because in most cases they are only ever used within the class itself.
The only exception to this that crosses my mind right now is UIView subclasses, and especially UITableViewCell. A lot of developers access the IBOutlets directly in cellForRowAtIndexPath:.
Apple engineers' message:
Encapsulate your IBOutlets & IBActions whenever possible!

ViewController does not function with Assistant editor

I recently copied my project across and whilst it compiles and runs correctly (all outlets function) i noticed that the data types don't highlight on my #property in two of my .H files.
After fiddling around i noticed that the view does not seem to have the .H file associated with it so when i use assistant mode the 'Automatic' option fails to work it states, "No assistant rules".
The class in the "identity inspector" is correctly linked to the .H file but after looking at the XML for the storyboard i noticed this:
<viewController title="First" id="2" customClass="FirstViewController" sceneMemberID="viewController">
In comparison to the view controllers that work correctly having this XML
<viewController title="buttonView" id="YcW-az-POT" customClass="buttonViewController" sceneMemberID="viewController">
I get this impression that the ID field seems to be causing issues, has anyone else experienced this or do they know how to fix this?
Very oddly, i committed my changes to my repository grabbed them on another device, then went back to the original device and pulled the changes made on the second device and the problem disappeared.
On further investigation it appeared to be as i initially suspected the ID was not correctly relating to the object. If you get this i suggest adding a new view and re-linking your content t the class implementation and it should resolve the issue.

Resources